在Nodejs中以Base64格式读取文件

121

我想从客户端以base64编码的形式读取一张图片。如何在nodejs中读取?

我的代码:

// add to buffer base64 image
var encondedImage = new Buffer(image.name, 'base64');

fs.readFile(encondedImage, "base64", function(err, buffer){
    if ( err ) {
        console.log('In read file')
        console.log(err)
    } else {
        // check err
        lwip.open(buffer, 'jpg', function(err, image){
            console.log('in open')
            if ( err ) console.log(err)

            if ( image ) console.log(image)
            // check 'err'. use 'image'.
            // image.resize(...), etc.
        });
    }
})

然而,我遇到了这个错误:

In read file
[Error: Path must be a string without null bytes.]

1
fs.readFile 的第一个参数应该是字符串类型,但你试图传递一个 Buffer 类型。 - cbr
4个回答

224

最新最好的方法是:

Node使用base64编码支持文件和缓冲区操作:

const fs = require('fs');
const contents = fs.readFileSync('/path/to/file.jpg', {encoding: 'base64'});

或者使用新的promises API

const fs = require('fs').promises;
const contents = await fs.readFile('/path/to/file.jpg', {encoding: 'base64'});

3
fs.readFileSync('/path/to/file.jpg', {encoding: 'base64'}) 并不会解码二进制数据,它等同于 fs.readFileSync('/path/to/file.jpg', 'utf8')。我们只是传递了一个编码参数以获得字符串而不是缓冲区。 - Ray Foss

134

我认为以下示例展示了你需要的内容:

我移除了链接,因为它已经失效。

这篇文章的要点就在于这段代码:

var fs = require('fs');

// function to encode file data to base64 encoded string
function base64_encode(file) {
    // read binary data
    var bitmap = fs.readFileSync(file);
    // convert binary data to base64 encoded string
    return new Buffer(bitmap).toString('base64');
}

// function to create file from base64 encoded string
function base64_decode(base64str, file) {
    // create buffer object from base64 encoded string, it is important to tell the constructor that the string is base64 encoded
    var bitmap = new Buffer(base64str, 'base64');
    // write buffer to file
    fs.writeFileSync(file, bitmap);
    console.log('******** File created from base64 encoded string ********');
}

// convert image to base64 encoded string
var base64str = base64_encode('kitten.jpg');
console.log(base64str);
// convert base64 string back to image 
base64_decode(base64str, 'copy.jpg');

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Alexis King
1
谢谢您的解释。现在我明白为什么会被踩了。 - Sjoerd
6
如果目标是创建一个 base64 编码的 data URI,这个解决方案有点不够。实际数据是正确的,但字符串缺少了 data:[<mediatype>][;base64], 前缀。 - Marty Chang
9
new Buffer 是冗余的。如果未指定编码,fs.readFileSync 将返回缓冲区。你可以直接使用 fs.readFileSync([..]).toString('BASE64') - Gajus
1
@Gajus 你甚至可以更进一步。readFileSync现在可以为您进行编码。只需执行 fs.readFileSync('...', { encoding: 'BASE64' }) 即可。 - Mike Martin
显示剩余6条评论

10
var fs = require('fs');

function base64Encode(file) {
    var body = fs.readFileSync(file);
    return body.toString('base64');
}


var base64String = base64Encode('test.jpg');
console.log(base64String);

2
以下代码读取文本文件,然后将其转换为文本格式,再以base64格式读取并放入二进制缓冲区中,并将其保存回真正的二进制格式。
import { readFileSync, writeFileSync } from 'fs'
import { tmpdir } from 'os'
const contents = readFileSync('./temp.txt')
const buffedInput = Buffer.from(contents.toString(), 'base64')
writeFileSync(`${tmpdir}/temp.zip`, buffedInput)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接