2014-11-07 2 views
1

Amazon S3 интерпретирует мои двоичные данные как не-UTF-8 и изменяет его, когда я пишу в ведро.Отправка двоичных данных в Amazon S3 (Javascript)

Пример с использованием официального s3 клиента Javascript:

var png_file = new Buffer("iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", "base64").toString("binary"); 
s3.putObject({ 
    Bucket: bucket, 
    Key: prefix + file, 
    ContentType: "image/png;charset=utf-8", 
    CacheControl: "public, max-age=31536000", 
    Body: png_file 
    // , ContentLength: png_file.length 
}, function(e){ 
    if (e) { 
    console.log(e); 
    } else { 
    s3.getObject({ 
     Bucket: bucket, 
     Key: prefix + file 
    }, function(e, v) { 
     if (e) { 
     console.log(e) 
     } else { 
     console.log(v.ContentLength); 
     } 
    }); 
    } 
}); 

Возвращает 105 в то время как оригинальный png_file является 85. S3 каким-то образом изменяет мой файл, и я думаю, что это связано с кодировками.

Если я раскомментировал строку Content-Length, я получаю ошибку 400 на putObject(): The Content-MD5 you specified did not match what we received.

Получается тот же результат, если я сам вычислил хэш MD5 (вместо того, чтобы позволить библиотеке S3 сделать это) с ContentMD5: crypto.createHash("md5").update(png_file).digest("base64"). Это, по-видимому, подтверждает разницу между данными, которые я отправляю, и тем, который получает S3.

Я прочел similarly titled issue, но это не решило проблему.

ответ

3

S3 putObject() принимает либо буфер или строку UTF-8. Я должен был послать двоичный файл как это, а не как «двоичную строку», то есть используя new Buffer(...) вместо new Buffer(...).toString("binary").

1

Кажется маловероятным, что S3 фактически модифицирует контент, который вы загружаете. Кажется, Nore вероятно, что это интерпретируется неправильно на загрузку, потому что это, кажется, не действует на PNG:

ContentType: "text/data;charset=utf-8", 

Это не правильно для файла PNG. Я бы предположил, что это то, что вы хотите:

ContentType: "image/png", 
+0

Извините, это была опечатка от меня. Я обновил исходный вопрос. Добавление или нет '; charset = utf-8' не изменяет результат. – ehmicky

+1

@ehmicky благодарит за принятие моего ответа, но я не думаю, что я действительно решил проблему для вас - я только заметил опечатку, но вы, кажется, нашли настоящую проблему и решили ее. Принятие вашего собственного ответа в порядке, здесь, особенно в тех случаях, когда вы действительно решали проблему самостоятельно, и ни один из других ответов не предлагал фактическое решение. По-моему, вы можете «не принять» мой ответ, снова нажав галочку. –

Смежные вопросы