我要在聊天中添加照片上传功能。我有this answer的POST解析器,还有一些将图像保存到上载目录的小代码。
var ext = exports.getFileExt(Object.keys(partsByName)[0]);
var time = (new Date()).getTime();
fs.writeFile("./img/user/upload_" + time + "." + ext,
partsByName[Object.keys(partsByName)[0]], "binary", function (err) {
if (!err) {
res.writeHead(200, "OK", { "Content-Type": "text/html" });
res.write(exports.wrapHTML(<title>, <html>, <font params>));
res.end();
} else {
console.error(err);
res.writeHead(500, "Internal Server Error");
res.end();
}
});
图像以预期的名称保存,但无法打开,我认为编码不正确。
源文件开始看起来像这样:
яШяа JFIF H H яб"Exif MM *
但新保存的文件不同:
ээээ JFIF H H ээ"Exif MM *
在找到答案之前,我尝试编写自己的解析器,并且它具有其他结构-它使用/boundary=(.+)/
正则表达式提取边界,然后从解析的文件名中获取文件扩展名,并使用数组切掉前两行,然后与“ \ r \ n”结合使用,并应用substr(boundary.length, data.length - (boundary.length * 2))
(以及一些其他更正),然后使用fs.writeFile
保存,然后文件再次看起来不正确。
UPD:现在我认为西里尔字母在发送数据时丢失了。在控制台和浏览器中,它们看起来像是未知字符(描边的矩形)。
答案 0 :(得分:1)
正文解析器可能不正确。以安全的方式处理multipart/form
POST数据可能非常棘手。
当您想更好地了解其工作原理时,最好编写自己的版本。一旦有了足够的了解,就应该从库切换到经过测试的代码。
关于第一个字节,有时也称为“魔术字节”,请在此处详细了解:https://en.wikipedia.org/wiki/List_of_file_signatures
大多数操作系统使用这些字节来确定文件的类型。