在Node Js中将base64图像转换为文件

6

我是Node Js的新手。我需要为用户包含个人资料图片。我会收到来自IOS应用程序的以base64格式编码的图像请求。我需要将其存储在images文件夹中,并将图像路径保存在mongodb数据库中。

我已经使用了以下代码:

var bitmap = new Buffer(req.body.profile_image, 'base64');
// write buffer to file
fs.writeFileSync("images/example.jpg", bitmap);

其中req.body.profile_image是一个base64图像。

我遇到了以下错误:

TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.

req.body.profile_image的值将会是:

+MZScHeJQ9Cz5dfxnEmIMHWMZyZYnYx8Rrhj0HbtfGUanv5w3UHUyADbiGsKJxeM1yV4uGwBS7cYlAec1w0AX6xg2A1O854UF8OS6PAP1MtzkeFnrNlD41U8XFeGrp1fn3jRMUs8sqS61umSS2rR2NDhppjZ4OvnOWBAq6X+sQNkhKkfZOdYsZOpz8fWIQb6wQ/GchVCgfZko4PMDg1DSumausG6o+2E6wKLLjKReUaHEQXKJV8h85XEKN4p/WEBvTHmmJ/IN178YJVgrGmfOScAuBPp+sggGA7/wC1kgbDiacbGABOcCLHVRpMuBQh5Xn4xqARF03pwkJT23LhxGLiSGp8mCVWDrzPf3iwp4C3nDSg2VUfNwgDvm6vrIiFJvp8ZHIdjoFx8BX0OH0+8TVii3GAKKc2kjz7dYqUCdsuMOm2hrr+h//Z

请帮忙。


fs.writeFileSync 不会返回任何内容。它会抛出一个错误对象。因此,在 try-catch 中编写 fs.writeFileSync(file, content, 'utf8'); - Mohammad Sayeed
1个回答

11

编辑:这段代码对我有效。也许错误发生在之后。

var fs = require("fs");
var image = "+MZScHeJQ9Cz5dfxnEmIMHWMZyZYnYx8Rrhj0HbtfGUanv5w3UHUyADbiGsKJxeM1yV4uGwBS7cYlAec1w0AX6xg2A1O854UF8OS6PAP1MtzkeFnrNlD41U8XFeGrp1fn3jRMUs8sqS61umSS2rR2NDhppjZ4OvnOWBAq6X+sQNkhKkfZOdYsZOpz8fWIQb6wQ/GchVCgfZko4PMDg1DSumausG6o+2E6wKLLjKReUaHEQXKJV8h85XEKN4p/WEBvTHmmJ/IN178YJVgrGmfOScAuBPp+sggGA7/wC1kgbDiacbGABOcCLHVRpMuBQh5Xn4xqARF03pwkJT23LhxGLiSGp8mCVWDrzPf3iwp4C3nDSg2VUfNwgDvm6vrIiFJvp8ZHIdjoFx8BX0OH0+8TVii3GAKKc2kjz7dYqUCdsuMOm2hrr+h//Z";
var bitmap = new Buffer(image, 'base64');
fs.writeFileSync("images/example.jpg", bitmap);

如果你说

console.log(req.body.profile_image) 

而不是
 console.log(typeof req.body.profile_image)

它会将req.body.profile_image中的任何数据转换为字符串后再进行打印。可能你只是在评论时忘记了'typeof',但如果没有添加'typeof',则不能确定它是否包含字符串。Buffer有不止一个构造函数,可能使用了错误的构造函数。

为了好玩尝试一下:

Buffer.from(String.fromCharCode.apply(null, new Uint16Array(req.body.profile_image)), "base64")

你能告诉我req.body.profile_image被分配了什么内容吗?

writeFileSync的第一个参数是字符串,所以它不能引起类型错误。你可以更具体地说明一下req.body.profile_image包含了什么吗?

顺便说一句,虽然我认为这与你的问题无关,但使用'new'关键字实例化Buffer已经过时了。也许使用Buffer.from(...)会让你朝着解决方案的方向前进。


请查看 req.body.profile_image 值的问题。 - rekha s
那么它是一个base64字符串吗?例如“VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==”?如果是的话,它不应该导致TypeError错误。如果你输入以下内容,你会看到什么:console.log(typeof req.body.profile_image); - charlie_destwin
如果我使用console.log(req.body.profile_image),我会得到一个字符串。 - rekha s
如果您尝试以下操作会发生什么:Buffer.from(req.body.profile_image, "base64") - charlie_destwin
我刚刚运行了这段代码,它对我很有效。我有一个包含数据的二进制文件,但它是一张格式不正确的JPG图片。也许如果你尝试加载这张图片可能会在后面发生错误。 - charlie_destwin

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