如何使用 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

大多数操作系统使用这些字节来确定文件类型。