所以我試圖在Node.js中編寫一個基本的文件服務器,並且我嘗試上傳並存儲在其上的所有圖像都已經損壞。這個問題似乎與Node Buffers處理被轉換爲UTF-8並返回的方式有關(爲了使POST主體頭部遠離二進制數據,我必須這樣做)。Node.js服務器:圖像上傳/損壞問題
這裏有一個簡單的節點服務器,顯示我目前的做法,我一直有問題:
var http = require('http');
var server = http.createServer(function(request, response) {
if (request.method === "GET") {
// on GET request, output a simple web page with a file upload form
var mypage = '<!doctype html><html><head><meta charset="utf-8">' +
'<title>Submit POST Form</title></head>\r\n<body>' +
'<form action="http://127.0.0.1:8008" method="POST" ' +
'enctype="multipart/form-data"> <input name="upload" ' +
'type="file"><p><button type="submit">Submit</button>' +
'</p></form></body></html>\r\n';
response.writeHead(200, {
"Content-Type": "text/html",
"Content-Length": mypage.length
});
response.end(mypage);
} else if (request.method === "POST") {
// if we have a return post request, let's capture it
var upload = new Buffer([]);
// get the data
request.on('data', function(chunk) {
// copy post data
upload = Buffer.concat([upload, chunk]);
});
// when we have all the data
request.on('end', function() {
// convert to UTF8 so we can pull out the post headers
var str = upload.toString('utf8');
// get post headers with a regular expression
var re = /(\S+)\r\nContent-Disposition:\s*form-data;\s*name="\w+";\s*filename="[^"]*"\r\nContent-Type: (\S+)\r\n\r\n/i,
reMatch = str.match(re);
var lengthOfHeaders = reMatch[0].length,
boundary = reMatch[1],
mimeType = reMatch[2];
// slice headers off top of post body
str = str.slice(lengthOfHeaders);
// remove the end boundary
str = str.replace("\r\n" + boundary + "--\r\n", '');
// convert back to buffer
var rawdata = new Buffer(str, 'utf8');
// echo back to client
response.writeHead(200, {
"Content-Type": mimeType
});
response.end(rawdata);
});
}
});
server.listen(8008);
console.log("server running on port 8008");
爲了測試它,在節點上運行腳本,然後轉到127.0.0.1:8008在您的瀏覽器。嘗試上傳圖片並提交表單。即使腳本應該直接將圖像數據回顯給瀏覽器,圖像每次都會損壞。
所以有人知道我在這裏做錯了嗎?有沒有更好的方法來處理Node中的POST body標題,我還沒有想出來? (和任何人說任何東西之前,不,我不想用快遞,我想弄清楚,理解這個問題。)
感謝您的建議。似乎在這種情況下,布斯博士可能會滿足我的需求。也就是說,我仍然想知道我在這裏做錯了什麼。除了使用您認爲可能導致它的正則表達式之外,還有其他什麼嗎? – 2014-10-19 23:20:32
此外,剛剛註冊[問題](https://github.com/mscdex/busboy/issues/62)在busboy上。似乎沒有爲我工作。 – 2014-10-19 23:53:55
你並沒有給busboy提供任何數據。在你的事件處理程序後添加'request.pipe(busboy);'。 – mscdex 2014-10-20 00:20:46