iOS 6(iPhone / iPad)イメージアップロード "Request Body StreamがNTLM / Windows認証"でアップロードする
-
12-12-2019 - |
質問
私は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ページには「要求ボディストリームが使い果たした」というエラーがあります。
これはインスペクタのスクリーンショットです:
任意のアイデア?
アップデート:この問題は、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,', '');
}
.