我将此Flex表单的内容(不要问为什么)发送到节点。有一个名为“photo”的帖子参数,它是base64编码的图像。
照片内容通过确认发送。问题是当我尝试解码内容并将其写入文件时。
var fs = require("fs");
fs.writeFile("arghhhh.jpg", new Buffer(request.body.photo, "base64").toString(), function(err) {});
我也尝试过toString(“binary”)。但似乎节点不解码所有内容。它似乎只解码jpg标题信息并留下其余部分。
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:26)
尝试完全删除.toString()
并直接写入缓冲区。
答案 1 :(得分:12)
这是我的完整解决方案,可读取任何base64图像格式,解码并以适当的格式保存在数据库中:
// Save base64 image to disk
try
{
// Decoding base-64 image
// Source: http://stackoverflow.com/questions/20267939/nodejs-write-base64-image-file
function decodeBase64Image(dataString)
{
var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/);
var response = {};
if (matches.length !== 3)
{
return new Error('Invalid input string');
}
response.type = matches[1];
response.data = new Buffer(matches[2], 'base64');
return response;
}
// Regular expression for image type:
// This regular image extracts the "jpeg" from "image/jpeg"
var imageTypeRegularExpression = /\/(.*?)$/;
// Generate random string
var crypto = require('crypto');
var seed = crypto.randomBytes(20);
var uniqueSHA1String = crypto
.createHash('sha1')
.update(seed)
.digest('hex');
var base64Data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAZABkAAD/4Q3zaHR0cDovL25zLmFkb2JlLmN...';
var imageBuffer = decodeBase64Image(base64Data);
var userUploadedFeedMessagesLocation = '../img/upload/feed/';
var uniqueRandomImageName = 'image-' + uniqueSHA1String;
// This variable is actually an array which has 5 values,
// The [1] value is the real image extension
var imageTypeDetected = imageBuffer
.type
.match(imageTypeRegularExpression);
var userUploadedImagePath = userUploadedFeedMessagesLocation +
uniqueRandomImageName +
'.' +
imageTypeDetected[1];
// Save decoded binary image to disk
try
{
require('fs').writeFile(userUploadedImagePath, imageBuffer.data,
function()
{
console.log('DEBUG - feed:message: Saved to disk image attached by user:', userUploadedImagePath);
});
}
catch(error)
{
console.log('ERROR:', error);
}
}
catch(error)
{
console.log('ERROR:', error);
}
答案 2 :(得分:2)
在nodejs 8.11.3中,new Buffer(string, encoding)
已过时,取而代之的是,Buffer.from(string, encoding)
始终没有.toString()
的新方法。
有关更多详细信息,请阅读nodejs docs: Buffer
答案 3 :(得分:0)
删除.toString()
这里你将base64解码为缓冲区,这很好,但是你将缓冲区转换为字符串。这意味着它是一个字符串对象,其代码点是缓冲区的字节。