下面是关于“实例详解Nodejs 保存 payload 发送过来的文件”的完整攻略:
1. 背景说明
在开发web应用程序时,经常需要通过上传文件的方式与客户端进行交互。客户端可以通过表单提交文件数据,也可以通过使用JavaScript编写发送文件的客户端来向服务器发送文件。
本文主要介绍使用Node.js处理通过POST请求发送的文件上传数据。
2. 如何保存通过POST请求发送过来的文件
在HTTP请求中,客户端可以通过两种方式将文件上传至服务器:以表单形式提交文件数据(multipart/form-data)或将文件作为Request Payload发送(application/octet-stream)。
下面将分别介绍如何处理这两种上传方式。
2.1 处理表单提交文件数据
客户端通常通过传统的HTML表单元素上传文件数据,服务器可以通过formidable模块轻松地处理这些数据。
示例:
const formidable = require("formidable");
const http = require("http");
const fs = require("fs");
http.createServer(function(req, res) {
if (req.url == "/upload" && req.method.toLowerCase() == "post") {
const form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
const oldpath = files.file.path;
const newpath = __dirname + "/uploads/" + files.file.name;
fs.rename(oldpath, newpath, function(err) {
if (err) throw err;
res.write("File uploaded and moved!");
res.end();
});
});
} else {
res.writeHead(200, { "Content-Type": "text/html" });
res.write('<form action="upload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
在上面的示例代码中,我们使用formidable模块来处理上传的数据。当客户端通过POST请求传递文件时,我们将在IncomingForm对象中设置encoding
和uploadDir
属性并调用parse()
方法来处理提交的数据。parse()
方法的回调函数会传递一个files
参数,其中包含了上传的文件信息。我们可以将该文件移动到一个指定的目录来保存它。在上述示例代码中,我们将文件保存到/uploads
目录下。
2.2 处理通过Request Payload发送的文件数据
有时,我们不得不通过Request Payload发送数据,这种情况在发送JSON或XML格式数据时尤为普遍。下面是如何将通过Request Payload发送的文件数据保存到磁盘的示例代码:
const http = require("http");
const fs = require("fs");
http.createServer(function(req, res) {
if (req.url == "/upload" && req.method.toLowerCase() == "post") {
const chunks = [];
let chunklen = 0;
req.on("data", function(chunk) {
chunks.push(chunk);
chunklen += chunk.length;
});
req.on("end", function() {
const buf = Buffer.concat(chunks, chunklen);
fs.writeFile("file.bin", buf, function(err) {
if (err) throw err;
res.writeHead(200, { "Content-Type": "text/html" });
res.write("File uploaded and saved!");
res.end();
});
});
} else {
res.writeHead(200, { "Content-Type": "text/html" });
res.write('<form action="upload" method="post" enctype="application/octet-stream">');
res.write('<input type="file" name="file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
在上面的示例代码中,当客户端通过POST方式以application/octet-stream
的MIME类型提交数据时,我们需要将请求数据流中的所有块合并到一个单一的缓冲区中,该缓冲区可以作为文件的二进制内容,调用fs.writeFile()
来将其保存到文件中。
3. 其他注意事项
- 在处理文件上传时,必须确保写入到磁盘的文件名不与已有文件的名称重复。为了实现这个目的,可以计算文件名的摘要,例如MD5或SHA1。;
- 文件上传时可能会存在一些安全风险,例如上传恶意文件,文件大小过大等情况。因此,需要实现一些安全措施,例如限制文件大小、检查文件类型等等。
结语
本文介绍了处理上传文件数据的两种技术,并提供了两个示例说明。当你需要在Node.js中实现文件上传时,这些技术可以作为你的参考文献。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实例详解Nodejs 保存 payload 发送过来的文件 - Python技术站