Estoy trabajando para que iOS 6 utilice XMLHttpRequest POSTs para cargar imágenes. Esto funciona en los navegadores web de escritorio y Android, pero con iOS 6 recibo un error en la página que se publica en: "Solicitud de flujo de cuerpo agotado". (Usando iOS Simulator con Safari Web Inspector).Carga de imágenes de iOS 6 (iPhone/iPad) "Solicitar flujo de cuerpo agotado" con autenticación NTLM/Windows
Este es el código básico de la página:
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.");
}
Al hacer esto en cualquier otro navegador, el controlador devuelve correctamente y carga el archivo. Sin embargo, con iOS, la página de ashx tiene el error "request body stream exhausted".
Aquí es una captura de pantalla del inspector:
¿Alguna idea?
ACTUALIZACIÓN: Este problema solo se produce cuando la autenticación NTLM/Windows está habilitada para la aplicación en IIS. Con formularios o autenticación anónima, la carga funciona bien.
Gracias,
John
Eso es lo que también he observado.Tu solución es interesante. Por el momento (he enviado un error a Apple para ver si podrían solucionarlo), en realidad tengo la carga del archivo en un iframe no autenticado que carga un archivo en la carpeta temporal de ASP.NET y devuelve un token que la página autenticada utiliza para hacer referencia al recuperar el archivo de la carpeta temporal. –
¿Hay una solución? Tal vez usando WCF, o tal vez usando alguna otra técnica? Estoy en SharePoint, y la autenticación de Windows es un requisito. – harsimranb