2011-08-28 7 views
1

HTML5의 XMLHttpRequest를 사용하여 파일을 업로드하려고합니다.HTML5 XHR FileUpload 및 ASP.Net의 문제점

여기 내 코드입니다 : 서버 측에

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx", true); 
//xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
xhr.setRequestHeader("Content-Type", "application/octet-stream"); 
xhr.send($("#fileobject").files[0]); 

, 나는 Request.Files.Count에 대한 0 얻을.

------WebKitFormBoundarylAWVSRo5qeSpsnzn Content-Disposition: 
form-data; name="fileToUpload"; filename="a.txt" Content-Type: 
application/octet-stream 

Testing 

------WebKitFormBoundarylAWVSRo5qeSpsnzn-- 

업로드 된 파일은 단어 "테스트"를 포함 : I는 입력 스트림을 읽으면 다음과 같이 그러나 나는 파일의 헤더를 얻는다.

서버 코드 :

Stream inputStream = Request.InputStream; 
FileStream fileStream = new FileStream("c:\\test.txt", FileMode.OpenOrCreate); 
inputStream.CopyTo(fileStream); 
fileStream.Close(); 

나는 Request.Files 서버 개체 채우기되지 내 클라이언트 자바 스크립트에서 누락 있나요? 아니면 헤더없이 파일 내용을 읽을 수있는 방법이 있습니까?

답변

1

당신은 multipart/form-data 요청 본문을 만들 XHR2의 FormData API를 사용한다. form-data 부분을 append() 방법으로 추가 할 수 있습니다. File도 허용됩니다.

var formData = new FormData(); 
formData.append("myfile", $("#fileobject").files[0]); 

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx"); 
xhr.send(formData); 

XHR2 적절한 헤더 요청 체 인코딩이 예에서 이름과 myfileform-data 일부로서 서버 측에서 사용할 수 파일에 대한 관리를 수행한다.

+0

감사합니다. 그래도 작동합니다. IE 10 Platform Preview 2를 포함하여 IE에서는 작동하지 않습니다. 젠장. ( – Arun

+0

당신은 환영합니다 .IE는 참으로 먼 길을 가고 있습니다. – BalusC

1

Request.Files 컬렉션은 요청의 ContentType이 multipart/form-data으로 설정되어 있지 않으면 채워지지 않습니다. 그것이 항상 당신을 위해 비어있는 이유입니다.

업데이트

저는 여기에 파일 업로드에 필요한 헤더/경계를 만듭니다, this site에서 발견 자바 스크립트 일부입니다. 확실하지 당신을 위해 작동하지만 수도 경우 :

function fileUpload(url, fileData, fileName) { 
    var fileSize = fileData.length, 
    boundary = "xxxxxxxxx", 
    xhr = new XMLHttpRequest(); 

    xhr.open("POST", url, true); 
      // simulate a file MIME POST request. 
    xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); 
    xhr.setRequestHeader("Content-Length", fileSize); 

    var body = "--" + boundary + "\r\n"; 
    body += 'Content-Disposition: form-data; name="contents"; filename="' + fileName + '"\r\n'; 
    body += "Content-Type: application/octet-stream\r\n\r\n"; 
    body += fileData + "\r\n"; 
    body += "--" + boundary + "--"; 

    xhr.send(body); 
    return true; 
} 
+0

시도해보십시오. 내 코드가 보이면 그 줄이 주석 처리됩니다. application/octet-stream 대신에 multipart/form-data를 사용하더라도 바뀌지 않습니다. – Arun

+0

여기에 다른 문제가있을 수 있습니다.하지만 content type이 multipart/form- 데이터가 채워지지 않습니다. 파일 컬렉션을 채우기 위해 ASP.NET이 사용하는 내부 메서드를 살펴 보았습니다. – patmortech

+0

감사합니다. 난 그냥 일반 파일 업로드 컨트롤을 시도하고 헤더에 작은 차이를 발견. 정기 업로드에는 다음 Content-Type = multipart/form-data가 포함됩니다. boundary = ---- WebKitFormBoundaryMaOZwv8AOdCyW0Mc. xhr에는 Content-Type = multipart/form-data;가 들어 있습니다. 경계가 누락되었습니다. 이것이 원인 일 수 있습니까? 경계를 직접 추가 할 수는 없습니다. 무작위로 생성 된 문자열 인 것 같습니다 – Arun