2013-12-17 108 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

相關問題