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

Javascript 如何使用Node.JS正确上传和保存照片(无框架),javascript,node.js,http,post,image-uploading,Javascript,Node.js,Http,Post,Image Uploading,我正在将照片上传功能添加到聊天中。我有来自的POST解析器,以及将图像保存到uploads目录的小代码 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]], "bin

我正在将照片上传功能添加到聊天中。我有来自的POST解析器,以及将图像保存到uploads目录的小代码

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();
        }
    });
var ext=exports.getFileExt(Object.keys(partsByName)[0]);
var time=(新日期()).getTime();
fs.writeFile(“./img/user/upload_uquo+time+”+ext,
partsByName[Object.keys(partsByName)[0]],“二进制”,函数(err){
如果(!err){
res.writeHead(200,“OK”,{“内容类型”:“text/html”});
res.write(exports.wrapHTML(,);
res.end();
}否则{
控制台错误(err);
res.writeHead(500,“内部服务器错误”);
res.end();
}
});
图像以预期的名称保存,但它没有打开,我认为编码不正确

源文件开始如下所示:

JFIF H HббExif MM*

但新保存的文件不同:

JFIF H HэExif MM*


在找到答案之前,我试着编写自己的解析器,它有其他的结构——它用
/boundary=(.+)/
regex提取边界,然后从解析的文件名中获取文件扩展名,用数组剪切前两行,然后加入“\r\n”,并应用
substr(boundary.length,data.length-(boundary.length*2))
(以及一些其他更正),使用
fs.writeFile
保存,文件再次看起来不正确


UPD:现在我认为西里尔文在发送数据时丢失了。在控制台和浏览器中,它们看起来像未知字符(笔划矩形)

主体解析器可能不正确。以安全的方式处理
multipart/form
POST数据可能相当棘手

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

关于第一个字节,它们有时被称为“魔法字节”,请阅读以下内容:


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

在找到答案之前,我尝试编写自己的解析器,它还有其他结构-使用
/boundary=(.+)/
regex提取边界,然后从解析的文件名中获取文件扩展名,用数组剪切前两行,然后用“\r\n”连接,并应用
substr(boundary.length,data.length-(boundary.length*2))
(以及一些其他更正),使用
fs.writeFile
保存,文件再次看起来不正确。不应将请求正文作为字符串而应作为字节读取。文件包含的字节在“转换”为字符串时会有不同的解释。只需读取字节,并根据规则处理它们。再次-如果你想在生产中使用这个,请使用库。谢谢!我试试看。现在我使用强大的,但不想使用它,所以尽快切换到自己的解析器!我应该将正文转换为缓冲区还是其他字节表示?