iOS 6 (iPhone / iPad) Изображение Загрузить «Запросить тесивый поток исчерпан» с помощью аутентификации NTLM / Windows
-
12-12-2019 - |
Вопрос
Я работаю над попыткой получить iOS 6, чтобы использовать XMLHTTPREQUEST POSTOR для загрузки изображений.Это работает на рабочем столе и веб-браузерах Android, но с iOS 6 я получаю ошибку на странице, размещенной: «Запросить тело тела, исчерпанного».(Использование симулятора IOS с веб-инспектором Safari).
Вот основной код страницы:
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 имеет ошибку «Запрос тела для тела исчерпан».
Вот скриншот инспектора:
Любые идеи?
Спасибо,
Джон
Решение
в iOS 6, Safari отправляет файл с исходным постом, включая файл.Это означает, что файл поток находится в конце, или «исчерпан».
Однако с NTLM он получит 401 вызов в ответ, а затем должен отправить сообщение с информацией о аутентификации.Поскольку он не сбрасывает поток файла, он не может отправить файл снова со вторым постом.Вы можете увидеть это в журнала IIS.
Насколько я знаю, вокруг этого нет особенно хорошего пути.Я изменяю свое мобильное приложение, так что он использует форму аутентификации.Я направляю мобильное приложение в отдельное приложение для входа на одном сервере, который установлен для использования аутентификации Windows.Приложение для входа в систему может затем перенаправить обратно в основное приложение с помощью файла Cookie формы, и все снова хорошо.
Вы должны установить машинный ключ на обоих приложениях в файле 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
. Другие советы
Я решил проблему, не устанавливая самоопределенную HTTP-аутентификацию на iOS 7 и iOS 8. (сначала наш сервис использует самостоятельное значение для головки аутентификации).И после того, как задача обрабатывается делегатом, запрос будет автоматически включать «аутентификацию: 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,', '');
}
.