2013-11-28 92 views
39

我的NodeJS服務器接收到base64編碼的圖片。NodeJS寫入base64映像文件

data:image/jpeg;base64,/9j/4QCcRXhpZgAASUkqAAgAAAA ... CiiigD//Z 

收到的數據應該保存爲jpg。因此我使用一個Buffer和FileSystemWriter:

var imageBuffer = new Buffer(data, 'base64'); //console = <Buffer 75 ab 5a 8a ... 
fs.writeFile("test.jpg", imageBuffer, function(err) { //... }); 

fs.writeFile不會調用錯誤。 jpeg文件已保存,但無法打開。 圖像查看說:

File is damaged or too big. 

原始文件是6KB大,新的文件7KB。

+8

你砍的在嘗試對數據進行base64解碼之前,先導'data:image/jpeg; base64,'? – CBroe

+0

不,我必須嗎?我認爲這些信息是imageBuffer所需要的 – marcel

+0

不,它是HTML中需要的img視頻標籤,base64部分是之後的部分,其中包含實際內容 – Mustafa

回答

91

你必須去掉它的url元信息,data:image/jpeg部分。 (重申@CBroe說的)這是一個小函數,用於從輸入字符串中返回正確的信息。

var data = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg=='; 

function decodeBase64Image(dataString) { 
    var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), 
    response = {}; 

    if (matches.length !== 3) { 
    return new Error('Invalid input string'); 
    } 

    response.type = matches[1]; 
    response.data = new Buffer(matches[2], 'base64'); 

    return response; 
} 

var imageBuffer = decodeBase64Image(data); 
console.log(imageBuffer); 
// { type: 'image/jpeg', 
// data: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 b4 00 00 00 2b 08 06 00 00 00 d1 fd a2 a4 00 00 00 04 67 41 4d 41 00 00 af c8 37 05 8a e9 00 00 ...> } 

然後您可以使用上述方法保存緩衝區。

fs.writeFile('test.jpg', imageBuffer.data, function(err) { ... }); 
+1

感謝Julian,我注意到你正在輸入一個png base64字符串並輸出一個jpg。那樣有用嗎?緩衝區是否會自動將其自身重新編碼爲新的文件類型?我在我的應用程序上做了類似的工作,似乎正在工作,但我只是想知道我是否仍然存儲帶有.jpg擴展名的png ... – newshorts

+2

通常,文件擴展名不會影響圖像的解析。操作系統通常會做各種事情來自動更正「文件類型」。我已更正答案以減少任何混淆。 –

+2

保存我的一天朱利安,完美的作品。謝謝 – notforever

21

另一種方法是使用fs.writeFile與剝出的元信息編碼後選擇base64

var image = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg=='; 

var data = image.replace(/^data:image\/\w+;base64,/, ''); 

fs.writeFile(fileName, data, {encoding: 'base64'}, function(err){ 
    //Finished 
}); 
0

試試這個簡單的方法在這裏1

var imgData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg=='; 
var base64Data = imgData.replace(/^data:image\/png;base64,/, ""); 


require("fs").writeFile("out.png", base64Data, 'base64', 
function(err, data) { 
if (err) { 
    console.log('err', err); 
} 
console.log('success'); 

}); 

focuse)data:image/png;basepng 2)replace(/^data:image\/png;這裏太png和名稱必須與3保存)writeFile("out.pngpng