2017-10-08 84 views
1

我想分析上傳文件並保存沒有任何第三個模塊,但仍然不成功。 我錯過任何部分?Node.js文件上傳服務器沒有第三方模塊

或者它需要先轉換爲緩衝區?

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); 

回答

0

價:Form submission

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

首先,dataBuffer。您不能直接使用+運算符。也正因爲如此,你不能使用正則表達式。

你可以試試這個

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."); 
} 

還有2個功能,幫助表單數據(允許多個文件)解析爲一個對象:

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; 
} 
相關問題