2017-04-19 55 views
3

我想用node.js fs.writeFile寫一個畫布數據作爲二進制.JPEG文件,但是在寫入文件後,我可以看到文件存儲爲普通測試,而不是二進制數據。使用node.js寫入二進制數據fs.writeFile創建一個圖像文件

這是從客戶端發送到我的節點data,代表JPEG圖像數據(只是幾首字符)的例子:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...

我在得到這個data客戶端通過執行:

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '') 

這裏是函數的用法我的node.js服務器

fs.writeFile('../some.jpeg', data, 'binary', function(err){}); 

取而代之的是文件被寫成二進制(״״ JFIF ...),將其寫入正是它從客戶端收到的數據。

我在這裏做錯了什麼?

+0

http://stackoverflow.com/a/6933413/1746830 – Rayon

+0

https://gist.github.com/madhums/e749dca107e26d72b64d另一種方法... – Rayon

+0

@Rayon謝謝,我m翻閱你的第一條評論 –

回答

7

JavaScript語言沒有讀取或操作二進制數據流的機制。 Buffer類是作爲Node.js API的一部分引入的,以便能夠在諸如TCP流和文件系統操作之類的情況下與八位字節流進行交互。

純粹javascript,而與unicode-encoded字符串,很好地處理直接的二進制數據。

當向socket寫入大量數據時,以binary格式存儲該數據要比從unicode轉換要高效得多。

var fs = require('fs'); 
// string generated by canvas.toDataURL() 
var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0" 
    + "NAAAAKElEQVQ4jWNgYGD4Twzu6FhFFGYYNXDUwGFpIAk2E4dHDRw1cDgaCAASFOffhEIO" 
    + "3gAAAABJRU5ErkJggg=="; 
// strip off the data: url prefix to get just the base64-encoded bytes 
var data = img.replace(/^data:image\/\w+;base64,/, ""); 
var buf = new Buffer(data, 'base64'); 
fs.writeFile('image.png', buf); 

Reference

+1

人造絲,這完美的作品。感謝來自以色列的所有幫助,和平和愛。 –

+0

- 我很高興它有幫助! _Happy Coding_ – Rayon

+0

*「純JavaScript ......不能很好地處理直接的二進制數據。」* - 我不明白這個答案,因爲這是最近的問答。你完全錯過了TypedArrays和ArrayBuffer嗎?二進制數據在JavaScript中不是問題,雖然它是「新鮮的」,但它不是*新的。 .https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays –