문제

XMLHTTPRequest Post를 사용하여 이미지를 업로드하려면 iOS 6을 사용하려고 노력하고 있습니다.이것은 데스크톱 및 Android 웹 브라우저에서 작동하지만 iOS 6에서는 페이지에 게시되는 페이지에 오류가 발생합니다.(Safari Web Inspector와 iOS 시뮬레이터 사용).

여기에 기본 코드 코드가 있습니다.

function fileSelected() {
    var file = document.getElementById('fileToUpload').files[0];
    if (file) {
        var fileSize = 0;
        if (file.size > 1024 * 1024)
            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
        else
            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
        document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
        document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
        document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
    }
}
function uploadFile() {
    var fd = new FormData();
    fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener("progress", uploadProgress, false);
    xhr.addEventListener("load", uploadComplete, false);
    xhr.addEventListener("error", uploadFailed, false);
    xhr.addEventListener("abort", uploadCanceled, false);
    xhr.open("POST", "/UploadHandler.ashx");
    xhr.send(fd);
}
function uploadProgress(evt) {
    if (evt.lengthComputable) {
        var percentComplete = Math.round(evt.loaded * 100 / evt.total);
        document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
        document.getElementById('prog').value = percentComplete;
    }
    else {
        document.getElementById('progressNumber').innerHTML = 'unable to compute';
    }
}
function uploadComplete(evt) {
    /* This event is raised when the server send back a response */
    alert(evt.target.responseText);
}
function uploadFailed(evt) {
    alert("There was an error attempting to upload the file.");
}
function uploadCanceled(evt) {
    alert("The upload has been canceled by the user or the browser dropped the connection.");
}
.

다른 브라우저 에서이 작업을 수행 할 때 핸들러가 올바르게 반환되고 파일을 업로드합니다.그러나 iOS에서 ASHX 페이지에는 "요청 바디 스트림이 소진됨"오류가 있습니다.

여기에 검사관의 스크린 샷이 있습니다.

신체 스트림 요청

아이디어가 있습니까?

update : 이 문제는 NTLM / Windows 인증이 IIS의 응용 프로그램에 대해 활성화 된 경우에만 발생합니다.양식이나 익명 인증을 사용하면 업로드가 잘 작동합니다.

감사합니다

John

도움이 되었습니까?

해결책

iOS 6에서 Safari는 파일을 포함하여 초기 게시물로 파일을 보냅니다.이는 파일 스트림이 끝에 있거나 "소진됨"을 의미합니다.

그러나 NTLM을 사용하면 응답으로 401 챌린지가 발생한 다음 인증 정보로 게시물을 다시 보내야합니다.파일 스트림을 재설정하지 않으므로 두 번째 게시물로 파일을 다시 보낼 수 없습니다.IIS 로그에서 이것을 볼 수 있습니다.

내가 아는 한 특별히 좋은 방법이 없습니다.나는 모바일 앱을 변경하여 양식 인증을 사용합니다.Windows 인증을 사용하도록 설정된 동일한 서버에서 모바일 앱을 연결하는 것과 동일한 서버에서 별도의 로그인 앱으로 지시합니다.로그인 앱은 양식 인증 쿠키를 사용하여 메인 앱으로 다시 리디렉션 할 수 있으며 모두 다시 잘됩니다.

Web.config 파일의 두 응용 프로그램에서 Machine 키를 설정하여 암호화 및 유효성 검사를 위해 동일한 키를 사용하고 있습니다.

로그인 앱의 코드는

만큼 간단합니다.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ 
Handles Me.Load
    With HttpContext.Current.User.Identity
        If .IsAuthenticated Then
            Dim sUser As String = .Name.ToLower.Trim
            FormsAuthentication.RedirectFromLoginPage(s, False)
        End If
    End With
End Sub
.

다른 팁

iOS 7 및 iOS 8에서 자체 정의 된 HTTP 인증 헤드를 설정하지 않음으로써 문제를 해결했습니다 (처음에는 우리의 서비스는 인증 헤드에 대한 자체 정의 된 값을 사용합니다).그리고 챌린지가 대리인이 처리 한 후에 요청에 "Authenticate : NTLMXXX 자동으로"헤더가 자동으로 "됩니다.그리고 넣고 게시물이 다시 작동합니다.

이 오류는 iOS에 있지만 다른 접근 방식을 사용할 수 있습니다. FormData에서 코드 줄을 변경하는 것과 같습니다.

파일을 추가하십시오.
var fd = new FormData();

fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
.

아래 줄에 기본적으로 파일 컨트롤을 추가하지 않지만 Base64 이미지 데이터 사용

var reader = new FileReader();

reader.readAsDataURL(opmlFile.files[0]);

reader.onload = function () {

    var base64DataImg = reader.result;            

    base64DataImg = base64DataImg.replace('data:'imagetype';base64,', '');      

}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top