IOS 6 (iPhone / iPad) Téléchargement d'image "Demander le flux de corps épuisé" avec authentification NTLM / Windows

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

Question

Je travaille sur la tentative d'obtention d'IOS 6 d'utiliser des poteaux XMLHTTPRequest pour télécharger des images.Cela fonctionne sur les navigateurs Web de bureau et Android, mais avec iOS 6, je reçois une erreur sur la page étant affichée dans: "Demander le flux de corps épuisé".(Utilisation du simulateur iOS avec l'inspecteur Web Safari).

Voici le code de base de la page:

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.");
}

Lorsque vous le faites sur un autre navigateur, le gestionnaire revient correctement et télécharge le fichier.Cependant, avec iOS, la page ASHX a le "Demander le flux d'organe de demande épuisé".

Voici une capture d'écran de l'inspecteur:

Demander le flux corporel épuisé

Des idées?

mise à jour: Ce numéro ne se produit que lorsque l'authentification NTLM / Windows est activée pour l'application dans IIS.Avec des formes ou une authentification anonyme, le téléchargement fonctionne bien.

merci,

Jean

Était-ce utile?

La solution

Dans iOS 6, Safari envoie le fichier avec le poste initial, y compris le fichier.Cela signifie que le flux de fichiers est à la fin ou "épuisé".

Cependant, avec NTLM, il obtiendra un défi 401 en réponse, puis doit renvoyer le poste avec les informations d'authentification.Comme il ne réinitialise pas le flux de fichiers, il est impossible d'envoyer le fichier à nouveau avec le deuxième poste.Vous pouvez voir cela dans les journaux IIS.

Autant que je sache, il n'y a pas de sens particulièrement bon autour de cela.Je change mon application mobile, de sorte qu'il utilise l'authentification de formulaire.Je dirigeai l'application mobile à une application de connexion distincte sur le même serveur, qui est définie pour utiliser l'authentification Windows.L'application de connexion peut ensuite rediriger vers l'application principale avec un cookie d'authentification de formulaire, et tout va bien.

Vous devez définir la clé de la machine sur les deux applications du fichier web.config, de sorte que les deux utilisent les mêmes clés pour le cryptage et la validation.

Le code sur l'application de connexion est aussi simple que

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

Autres conseils

J'ai résolu le problème en ne définissant pas la tête d'authentification HTTP auto-définie sur iOS 7 et iOS 8. (Au début, notre service utilise la valeur auto-définie pour la tête authentifiée).Et après que le défi soit géré par le délégué, la demande aura l'en-tête «authentifier: NTLMXXX».Et le put et la poste fonctionne à nouveau.

Cette erreur s'allume sur iOS mais vous pouvez utiliser une approche différente J'aime changer votre ligne de code dans formdata où vous appuyez sur le fichier

var fd = new FormData();

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

à la ligne ci-dessous ne fait fondamentalement pas le contrôle du fichier, mais utilisez les données d'image de base64

var reader = new FileReader();

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

reader.onload = function () {

    var base64DataImg = reader.result;            

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top