如何使用 Node.JS 正确上传和保存照片(无框架)
How to properly upload and save photo using Node.JS (no frameworks)
我正在为我的聊天添加照片上传功能。我有来自 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=(.+)/
正则表达式提取边界,然后从解析的文件名中获取文件扩展名,并用数组剪切 2 个第一行,然后加入“\r\n”,并应用 substr(boundary.length, data.length - (boundary.length * 2))
(以及一些其他更正),使用 fs.writeFile
保存,文件再次看起来不正确。
更新:现在我认为西里尔字母在发送数据时丢失了。在控制台和浏览器中,它们看起来像未知字符(描边矩形)。
正文解析器可能不正确。以安全的方式处理 multipart/form
POST 数据可能相当棘手。
如果您想更好地了解它的工作原理,编写您自己的版本非常好。一旦您有足够的理解,就应该从库中切换到经过实战测试的代码。
关于第一个字节,有时称为 'magic bytes',请在此处阅读更多信息:https://en.wikipedia.org/wiki/List_of_file_signatures
大多数操作系统使用这些字节来确定文件类型。
我正在为我的聊天添加照片上传功能。我有来自 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=(.+)/
正则表达式提取边界,然后从解析的文件名中获取文件扩展名,并用数组剪切 2 个第一行,然后加入“\r\n”,并应用 substr(boundary.length, data.length - (boundary.length * 2))
(以及一些其他更正),使用 fs.writeFile
保存,文件再次看起来不正确。
更新:现在我认为西里尔字母在发送数据时丢失了。在控制台和浏览器中,它们看起来像未知字符(描边矩形)。
正文解析器可能不正确。以安全的方式处理 multipart/form
POST 数据可能相当棘手。
如果您想更好地了解它的工作原理,编写您自己的版本非常好。一旦您有足够的理解,就应该从库中切换到经过实战测试的代码。
关于第一个字节,有时称为 'magic bytes',请在此处阅读更多信息:https://en.wikipedia.org/wiki/List_of_file_signatures
大多数操作系统使用这些字节来确定文件类型。