我正在编写一个代码让客户端上传服务器上的两个文件。 (基于边界改变浏览器)如何在nodejs中处理http请求中的表单数据
request.chunks = [];
request.on('data', function (chunk) {
request.chunks.push(chunk.toString());
};
,这里是当客户端上传文件的数据块的的console.log:由于我使用的路由器的导演,我已经设置了听众这样
-----------------------------7dd2c419180232
Content-Disposition: form-data; name="filename"
-----------------------------7dd2c419180232
Content-Disposition: form-data; name="uploadfile"; filename="first.txt"
Content-Type: application/octet-stream
the content of first file
-----------------------------7dd2c419180232
Content-Disposition: form-data; name="wfilename"
-----------------------------7dd2c419180232
Content-Disposition: form-data; name="wuploadfile"; filename="second.txt"
Content-Type: application/octet-stream
the content of the second file
-----------------------------7dd2c419180232--
我已经几个正则表达式处理的问题用于提取每个文件名,并在request.chunks
变量中的每个文件的内容,但浏览器有不同的倾向(这些boundries,例如谷歌浏览器是这个样子:'------ WebKit ...'),我想知道是否有直接的方法来解析文件名和文件内容(显然是从request.chunks
不是request
)与一些模块如强大或多部分或querystring?
感谢@micnic,我想出了一个头文件解析器。这可能需要在此级别欢迎修订:
exports.parseMultipart = function(request) {
// Convert the chunks to string
var str = request.chunks.toString();
// Get the boundry out pf header
var boundry = '--' + request.headers["content-type"].substring(request.headers["content-type"].indexOf('=')+1, request.headers["content-type"].length);
// Initialization
var request_data = {};
index = 0;
// For each form element, store the value in request_data
while (str.indexOf(boundry, index) != -1) {
index += boundry.length;
i = str.indexOf(" name=\"",index);
j = str.indexOf("\"",i+7);
name = str.substring(i+7,j);
var value = {};
if (str.charAt(j+1)==';') {
value["type"] = "file";
i = j + 3;
j = str.indexOf("\"",i+14);
filename = str.substring(i+10, j);
value["filename"] = filename;
i = j + 17;
j = str.indexOf("\r", i);
contentType = str.substring(i, j);
value["content-type"] = contentType;
i = j + 4;
j = str.indexOf("\n\r\n" + boundry, i);
fileContent = str.substring(i, j);
value["content"] = fileContent;
} else {
value["type"] = "field";
i = j + 5;
j = str.indexOf("\r\n" + boundry,i);
value["content"] = str.substring(i,j);
}
index = str.indexOf(boundry, index) + 2;
request_data[name] = value;
}
return request_data;
}
你提到的强大,然后用它;-) – TheHippo
@TheHippo强大的用途要求的身体,但我想用块变量! – orezvani