2013-12-17 109 views
0

寻找一些newb NodeJS帮助。那里有一些简单的东西我可以忽略,但我试过这几种方式,并且不断得到奇怪的结果。无法使用Node.js读取和写入二进制数据

我从this question以下大部分代码。

// 128Kb Chunks 
var targetSize = 131072; 

// Open the file 
fs.open('/project/input.png', 'r', function(err, fd) { 

    // Gather some info about the file 
    fs.fstat(fd, function(err, stats) { 
     var bufferSize=stats.size, 
      chunkSize=targetSize, 
      buffer=new Buffer(bufferSize), 
      bytesRead = 0, 
      isFinal = false; 

     while (bytesRead < bufferSize) { 

      if ((bytesRead + chunkSize) > bufferSize) { 
       chunkSize = (bufferSize - bytesRead); 
       isFinal = true; 
      } else { 
       isFinal = false; 
      } 

      fs.read(fd, buffer, bytesRead, chunkSize, bytesRead); 

      bytesRead += chunkSize; 

      if(isFinal) { 
       fs.writeFileSync("/project/output.png", buffer); 
      } 

     } 

    }); 

    // Done 
    fs.close(fd); 

}); 

当我输出的output.png文件,该文件具有相同的文件大小为我的输入(所以必须有所八九不离十工作?),我的图像浏览器无法读取该文件,因此它以某种方式损坏。

我试图保持这个问题,例如尽可能简单,但如果它的事项或提示进一步的意见,这里有我的核心目标:

  • 阅读文件中固定的块大小(128KB)
  • 加密并存储在MongoDB中每个块(这里故意除外)
  • 以后能够重新组装上

我感谢所有帮助您可以给图像。


更新: 找到了答案,并预期它很简单。

我复制的代码有一个小的错误,即fs.close()

被读取之前它的流正被关闭。

这也是可见,当我添加了一个回调到我的fs.read,其中有一个 'ERR' 第一个参数:

[Error: EBADF, read] errno: 9, code: 'EBADF' 

回答

0

尝试改变线

while (bytesRead < bufferSize) 

while (bytesRead < bufferSize && !isFinal) 

我不知道这是否能解决问题,但这是一个开始。

也为效率的缘故,你不需要的部分:

} else { 
    isFinal = false; 
} 

由于isFinal会是假的呢(你永远不会在这行会改变它)。

+0

所有好的建议,我很感激他们,但正如你所警告的那样,他们对结果没有影响:\ \ – LukeChavers

相关问题