Node.jsfile upload服务器没有第三方模块

我想parsing上传文件并保存没有任何第三个模块,但仍然不成功。 我错过任何部分?

或者它需要先转换为缓冲区?

var http = require('http'); const fs = require ('fs'); http.createServer(function (req, res) { if (req.url == '/fileupload') { var body = ''; req.on('data', (data) => { body += data; }); req.on('end', () => { body = body.replace(/-.+-/g, '').replace(/WebKit.+|Contentdata.+|Content-Type.+/g, ''); fs.writeFile('test.png', body, (err) => { if (err) throw err; console.log('The file has been saved!'); }); res.end(body); }) } else { res.writeHead(200, { 'Content-Type': 'text/html' }); res.write('<form action="fileupload" method="post" enctype="multipart/form-data">'); res.write('<input type="file" name="filetoupload"><br>'); res.write('<input type="submit">'); res.write('</form>'); return res.end(); } }).listen(8080); 

参考: 表格提交

 req.on('data', (data) => { body += data; }); 

首先, data是一个Buffer 。 您不能直接使用+运算符。 也正因为如此,你不能使用正则expression式。

你可以试试这个

 req.res=res; req.on("data", onPosting).on("end", onPosted); 

onPostingonPosted定义如下:

 function onPosting(data){ if (this.data){ this.data.fill(data, this.dataIndex); this.dataIndex += data.length; } else { var contentLength = +this.headers["content-length"]; if (data.length === contentLength){ this.data = data; } else { this.data = Buffer.alloc(contentLength); this.data.fill(data); this.dataIndex = data.length; } } } function onPosted(){ var boundary = extract(this.headers["content-type"], " boundary="); var form = parseForm(boundary, this.data); console.log(form); this.res.end("Data Posted."); } 

还有两个函数可以帮助parsing表单数据(允许多个文件)到一个对象:

 function extract(arr, start, end){ var useIndex = typeof start === "number", i, j; if (useIndex){ i = start; if (end){ j = arr.indexOf(end, i); return (j === -1) ? ["", -1] : [ (i === j) ? "" : arr.slice(i, j), j + end.length]; } else return arr.slice(i); } else { i = arr.indexOf(start); if (i !== -1){ i += start.length; if (end){ j = arr.indexOf(end, i); if (j !== -1) return arr.slice(i, j); } else return arr.slice(i); } return ""; } } function parseForm(boundary, data){ var form = {}, delimiter = Buffer.from("\r\n--" + boundary), body = extract(data, "--" + boundary + "\r\n"), CR = Buffer.from("\r\n\r\n"), i = 0, head, name, filename, value, obj; if (body) { while (i !== -1){ [head, i] = extract(body, i, CR); name = extract(head, '; name="', '"').toString(); filename = extract(head, '; filename="', '"').toString(); [value, i] = extract(body, i, delimiter); if (name){ obj = filename ? {filename, value} : {value}; if (form.hasOwnProperty(name)){ // multiple if (Array.isArray(form[name])){ form[name].push(obj); } else { form[name] = [form[name], obj]; } } else { form[name] = obj; } } if (body[i] === 45 && body[i + 1] === 45) break; // "--" if (body[i] === 13 && body[i + 1] === 10){ i += 2; // "\r\n" } else { //error } } } return form; }