我在使用imagemagick處理圖像然後將其上傳到S3時出現問題。產生的對象具有不同(更大)的尺寸並且似乎損壞。如果我進行一箇中間步驟並將輸出保存到本地tmp文件並將其讀回,那麼上傳結果一切似乎都很好。這是不起作用的代碼。node.js將imagemagick的輸出上傳到AWS S3
im.resize({
srcData: imageObject.Body,
width: variant.width,
height: variant.height,
customArgs: ['-auto-orient']
}, function(err, stdout, stderr) {
if (err) {
// This resize completed successfully
log.err('Failed calling imageMagick, bail out', err);
callback(err);
return;
}
var fileName = cfg.aws.s3.uploadDir +
photo.imageId + '/' +
variant.width + 'x' + variant.height + '.jpg';
log.info('Storing image at S3 ' + fileName);
//fs.writeFileSync('/tmp/xxx.jpg', stdout, 'binary');
//stdout = fs.readFileSync('/tmp/xxx.jpg');
var x = new Buffer(stdout);
console.log(x);
s3.putObject(
{
Bucket: cfg.aws.s3.bucket,
Key: fileName,
Body: x,
ContentType: 'image/jpeg',
ACL: 'public-read'
},
function(err, data) {
if (err) {
// Failed saving to S3
log.error('Failed saving to S3', err);
}
callback(err);
}
);
});
取消對fileWriteSync和fileReadSync和它工作正常。
所述的console.log(x)的命令的在兩種情況下的輸出: BAD:
緩衝液C3 BF C3 98 C3 C3 BF A0 00 10 4A 46 49 46 00 01 01 01 00 01 00 01 00 00 C3 C3 BF 9B 00 43 00 06 04 05 06 05 04 06 06 05 06 07 07 06 08 0A 10 0A 0A 09 09 ...>
GOOD:
緩衝區ff d 8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 01 00 01 00 00 ff db 00 43 00 06 04 05 06 05 04 06 06 05 06 07 07 06 08 0a 10 0a 0a 09 09 0a 14 0e 0f 0C 10 ...>
,你可以看到良好的一個是正確的JPEG,壞一個雖然包含像圖4a相似的序列46 49 46 = JFIF,然而,一些字節都關閉,並且有變化,所述在不好的情況下整個文件大約增加20%。
與編碼有關嗎?我已經嘗試了幾件事情,但在這一點上我迷失了方向。
謝謝!
更新#1: 顯然,這是關係到UTF編碼,但我還是不完全理解在這種情況下會發生什麼。顯然C3 BF C3 98 C3 C3 BF A0 00 10 4A 46 49 46 00 01是UTF編碼:
U+00FF LATIN SMALL LETTER Y WITH DIAERESIS character (ÿ)
U+00D8 LATIN CAPITAL LETTER O WITH STROKE character (Ø)
U+00FF LATIN SMALL LETTER Y WITH DIAERESIS character (ÿ)
U+00E0 LATIN SMALL LETTER A WITH GRAVE character (à)
U+0000 <control> character
U+0010 <control> character
U+004A LATIN CAPITAL LETTER J character
U+0046 LATIN CAPITAL LETTER F character
U+0049 LATIN CAPITAL LETTER I character
U+0046 LATIN CAPITAL LETTER F character
U+0000 <control> character
U+0001 <control> character
當FF FF D8 ..正是我期待。
我知道如何使代碼工作,而臨時文件(替代VAR X =新的緩衝區(標準輸出);使用var X =新的緩衝區(標準輸出, '二進制'))
不過我仍然不能說我完全理解這裏發生了什麼,這應該不用Buffer()來包裝,哪個組件有問題? ImageMagick的?緩衝?
哇,這是一個奇怪的問題。措辭措辭良好的問題和有趣的問題。我會看看我是否可以在今天的某個時間查看:) –
出於好奇,如果不將stdout放入新的緩衝區對象,會發生什麼?它是否以node-imagemagick作爲字符串出來?如果它作爲一個緩衝區無論如何,腐敗可能是雙緩衝區包裝... –
你嘗試了'身體:標準輸出',在你的putObject選項發送標準輸出沒有包裝在不必要的緩衝區? –