2014-11-07 4 views
1

Amazon S3는 내 이진 데이터를 비 UTF-8로 해석하고 버킷에 쓸 때이를 수정합니다. 공식 S3 자바 스크립트 클라이언트를 사용하여Amazon 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_file85된다. S3가 어떻게 든 내 파일을 수정하고 charset과 관련이 있다고 생각합니다.

Content-Length 줄의 주석을 제거하면 putObject() : The Content-MD5 you specified did not match what we received에 400 오류가 발생합니다.

ContentMD5: crypto.createHash("md5").update(png_file).digest("base64")으로 MD5 해시를 직접 계산하면 (S3 라이브러리에서 처리하는 대신) 동일한 결과가 나타납니다. 이것은 내가 보낸 데이터와 S3가받는 데이터의 차이점을 인정하는 것 같습니다.

나는 similarly titled issue을 읽었지만 문제를 해결하지 못했습니다.

답변

3

S3 putObject()은 버퍼 또는 UTF-8 문자열 중 하나를 가정 :이 당신이 원하는 것을 건의 할 것입니다. 바이너리를 "바이너리 문자열"이 아닌, new Buffer(...).toString("binary") 대신 new Buffer(...)을 사용해서 보내야합니다.

1

S3가 업로드중인 콘텐츠를 실제로 수정하는 것 같지 않습니다. 그것은이는 PNG 유효하지 않는 것 때문에, 그것은 다운로드 잘못 해석되고 있다고 NORE 가능성이 보인다 :

PNG 파일에 대한 올바른 아니다
ContentType: "text/data;charset=utf-8", 

.

ContentType: "image/png", 
+0

죄송합니다. 이것은 저의 오타였습니다. 원래의 질문을 업데이트했습니다. '; charset = utf-8'을 추가하거나하지 않으면 출력을 수정하지 않습니다. – ehmicky

+1

@ehmicky는 내 대답을 수락 해 주셔서 감사합니다. 그러나 문제가 해결되지 않았다고 생각합니다. 오타가 발견되었지만 실제 문제를 발견하고 해결 한 것으로 보입니다. 자신의 답을 수락하는 것은 괜찮습니다. 특히, 실제로 문제를 직접 해결 한 경우와 다른 해결책 중 어느 것도 실제 해결책을 제시하지 않은 경우에 특히 그렇습니다. 체크 표시를 다시 클릭하여 내 대답을 "취소"할 수 있습니다. –