读取多部分/表单数据保存不正确

时间:2018-08-26 20:17:04

标签: javascript node.js http multipartform-data form-data

我正在尝试从http图片文件上传中读取数据。似乎可以读取文件,但是由于某种原因,输出文件的大小约为原始文件的两倍。

原文:94.7KB
临时文件:168.8 KB

当我在文本编辑器中打开两个文件时,它们的行数相同,并且开始和结束字符相同。这使我相信上载的文件将被保存为字符串而不是二进制数据。

我相信重要的部分如下

读取数据:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/css/foundation-float.css">
<div class="row first">
  <h1>1. Padding with Rate</h1>
  <div class="image-landscape">
    <img src="https://dummyimage.com/831x554/404040/fff&text=1" width="831" height="554">
  </div>
  <div class="image-portrait">
    <img src="https://dummyimage.com/369x554/404040/fff&text=2" width="369" height="554">
  </div>
</div>
<div class="row second">
  <h1>2. Keep Padding</h1>
  <div class="image-landscape">
    <img src="https://dummyimage.com/831x554/404040/fff&text=1" width="831" height="554">
  </div>
  <div class="image-portrait">
    <img src="https://dummyimage.com/369x554/404040/fff&text=2" width="369" height="554">
  </div>
</div>

数据保存:

let body = ''
req.on('data', data => {
  body += data.toString()
}).on('end', data => {
  if (data) body += data.toString()
  // Rest of block
})

这里是数据的完整解析:

// If there is a filename grab the file data
if (result.filename.length > 0) {
  // Create a temporary url
  let temp = join(os.tmpdir(), (Math.random() * 10000).toString(12).substr(5, 10))

  // Get the data between the blocks after the first two newlines
  let matches = item.match(/^.+?(\r\n\r\n|\n\n)(.+)/s)

  // Write the data to file
  fs.createWriteStream(temp).write(matches[2])
}

1 个答案:

答案 0 :(得分:0)

所以,我在两种情况下都是正确的...

首先,我必须像这样将数据读取为二进制数据:

body += data.toString('binary')

下一步,保存时,我需要这样保存为二进制数据:

fs.createWriteStream(temp).write(matches[2], 'binary')

这现在保存为正确的文件大小,并且图像可读!