iOS 6(iPhone / iPad)イメージアップロード "Request Body StreamがNTLM / Windows認証"でアップロードする

StackOverflow https://stackoverflow.com//questions/12694310

質問

私はiOS 6にXMLHTTPRequest投稿を使用して画像をアップロードしようとしています。これはデスクトップとAndroidのWebブラウザで機能しますが、iOS 6では、POSTが投稿されているページにエラーが発生しています。(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.");
}
.

他のブラウザでこれを行う場合、ハンドラは正しく返し、ファイルをアップロードします。ただし、ASHXページには「要求ボディストリームが使い果たした」というエラーがあります。

これはインスペクタのスクリーンショットです:

Body Stream Electeded

任意のアイデア?

アップデート:この問題は、IISのアプリケーションに対してNTLM / Windows認証が有効になっている場合にのみ発生します。フォームまたは匿名認証では、アップロードは大丈夫です。

ありがとう、

ヨハネ

役に立ちましたか?

解決

IOS 6では、Safariはファイルを含む最初の投稿でファイルを送信します。つまり、ファイルストリームが最後にある、または「疲弊しました」ということです。

しかし、NTLMでは、それに応じて401のチャレンジを得てから、認証情報とポストを再送信する必要があります。ファイルストリームがリセットされないため、2番目の投稿でファイルを送信することはできません。これをIISログで確認できます。

私が知っている限りでは、周りに特に良い方法はありません。フォーム認証を使用するように、モバイルアプリを変更しています。私はモバイルアプリを同じサーバー上の別のログインアプリに指示します。これは、Windows認証を使用するように設定されています。その後、ログインアプリはフォーム認証クッキーを使用してメインアプリに戻すことができます。また、すべてが再び元気です。

web.configファイル内の両方のアプリにマシンキーを設定する必要があるため、両方とも暗号化と検証に同じキーを使用しています。

ログインアプリのコードは

のように単純です
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認証ヘッドを設定しないことで問題を解決しました(最初に、私たちのサービスは認証ヘッドの自己定義値を使用します)。また、課題が委任者によって処理された後、要求には「認証:NTLMXXXは自動的に自動的に」ヘッダーになります。そして投稿と投稿は再び作品します。

このエラーはiOSにありますが、別のアプローチを使用することができます ファイルを追加する

のコードラインを変更するのが好きです。
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