2012-07-12 2 views
5

JQuery를 처음 사용하고 JQuery Ajax를 사용하여 일부 파일을 서버에 업로드하고 싶습니다. PUT 메서드에서만 사용합니다. 내 서버에 바이너리 파일 (예 : gif 또는 jpeg)을 보내면 업로드가 성공하지만 바이너리 데이터의 내용이 변경되었습니다. 항상 원본 파일 크기보다 큽니다. 콘텐츠 형식이나 파일 형식을 변경하려고 시도하지만 여전히 작동하지 않습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니다.JQuery Ajax PUT 메서드를 통해 이진 데이터를 보내는 방법

추 신 : 서버 코드를 건드릴 수 없기 때문에 이진 파일의 내용을 다른 형식으로 인코딩 할 수 없습니다. XMLHttpRequest를 통해 그들을 보낼 때

var reader = new FileReader(); 

reader.onloadend = (function(Thefile) { 

    $.ajax({ 
     url: url, 
     processData:false, 
     //contentType:"application/octet-stream; charset=UTF-8", 
     data: file.result, 
     type: 'PUT', 
     success : function(){console.log("OK!");}, 
     error : function(){console.log("Not OK!");} 
    }); 
})(file); 

reader.readAsBinaryString(file); 
+0

비슷한 문제가 발생했습니다. 내 첫 번째 추측은 요청을 보내기 전에'ajax' 함수가 데이터를 처리하는 방식과 관련이 있다는 것입니다. –

+0

jQuery AJAX 기계류에 관계없이 reader.onloadend에 함수를 할당해야 함을 알아 두십시오. 직접 함수를 호출하면 안됩니다! – Tom

답변

3

대부분의 (모든?) 브라우저가 자동으로 UTF-8로 문자열 데이터 유형을 변환합니다. 이 파일을 바이너리 문자열로 읽을 때 정확하게 주어진다 : 각 문자가 0에서 255 사이의 값인 JavaScript 문자열 객체

AJAX 요청이 바이너리 인코딩 된 데이터를 보내도록 강제하려면 데이터 매개 변수 ArrayBuffer, File 또는 Blob 개체 여야합니다.

당신이 보내기 전에 파일의 내용에 액세스해야하는 경우, 다음과 같은 코드를 가진 ArrayBuffer에 이진 문자열을 변환 할 수 있습니다

var arrBuff = new ArrayBuffer(file.result.length); 
var writer = new Uint8Array(arrBuff); 
for (var i = 0, len = file.result.length; i < len; i++) { 
    writer[i] = file.result.charCodeAt(i); 
} 

그리고 당신이 AJAX 기능에 arrBuff 인스턴스를 전달 것 . 그렇지 않으면 FileReader 코드를 사용하지 않고 File 객체 자체를 AJAX 함수로 전달할 수 있어야합니다.