iOS 6 (iPhone / iPad) Изображение Загрузить «Запросить тесивый поток исчерпан» с помощью аутентификации NTLM / Windows

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

Вопрос

Я работаю над попыткой получить 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 имеет ошибку «Запрос тела для тела исчерпан».

Вот скриншот инспектора:

Запросить тестовый поток, исчерпанный

Любые идеи?

Обновление: Эта проблема возникает только при включении аутентификации NTLM / Windows для приложения в IIS.С формыми или анонимными аутентификациями загрузка работает нормально.

Спасибо,

Джон

Это было полезно?

Решение

в 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,', '');      

}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top