如何使用Node.JS正确上传和保存照片(无框架)

时间:2018-06-24 00:09:02

标签: javascript node.js http post image-uploading

我要在聊天中添加照片上传功能。我有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:现在我认为西里尔字母在发送数据时丢失了。在控制台和浏览器中,它们看起来像是未知字符(描边的矩形)。

1 个答案:

答案 0 :(得分:1)

正文解析器可能不正确。以安全的方式处理multipart/form POST数据可能非常棘手。

当您想更好地了解其工作原理时,最好编写自己的版本。一旦有了足够的了解,就应该从库切换到经过测试的代码。

关于第一个字节,有时也称为“魔术字节”,请在此处详细了解:https://en.wikipedia.org/wiki/List_of_file_signatures

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