2011-08-28 3 views
1

J'essaye de télécharger un fichier en utilisant XMLHttpRequest de HTML5.Problème avec HTML5 XHR FileUpload et ASP.Net

Voici mon code:

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx", true); 
//xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
xhr.setRequestHeader("Content-Type", "application/octet-stream"); 
xhr.send($("#fileobject").files[0]); 

Du côté du serveur, je reçois 0 pour le Request.Files.Count. Toutefois, si je lis le flux d'entrée, je reçois les en-têtes du fichier comme suit:

------WebKitFormBoundarylAWVSRo5qeSpsnzn Content-Disposition: 
form-data; name="fileToUpload"; filename="a.txt" Content-Type: 
application/octet-stream 

Testing 

------WebKitFormBoundarylAWVSRo5qeSpsnzn-- 

Le fichier téléchargé ne contient que le mot « test ».

Code Serveur:

Stream inputStream = Request.InputStream; 
FileStream fileStream = new FileStream("c:\\test.txt", FileMode.OpenOrCreate); 
inputStream.CopyTo(fileStream); 
fileStream.Close(); 

Est-ce que je me manque dans mon client Javascript qui n'est pas peuplant le Request.Files objet sur le serveur? Ou est-il possible de lire uniquement le contenu du fichier sans les en-têtes?

Répondre

1

Vous devez utiliser FormData API de XHR2 pour créer un corps de demande multipart/form-data. Vous pouvez ajouter chaque partie form-data par la méthode append(). Il accepte également un File.

var formData = new FormData(); 
formData.append("myfile", $("#fileobject").files[0]); 

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx"); 
xhr.send(formData); 

XHR2 prendra soin de têtes appropriés et le codage du corps de la requête et le fichier sera dans cet exemple disponible dans le côté serveur form-data partie avec le nom myfile.

+0

Merci, cela fonctionne. Mais ne fonctionne pas dans IE, y compris IE 10 Platform Preview 2 !!! Merde IE. :( – Arun

+0

De rien, IE a en effet un long chemin à parcourir (ce n'est pas étonnant). – BalusC

1

La collection Request.Files ne sera pas remplie à moins que le ContentType de la demande ne soit défini sur multipart/form-data. C'est pourquoi c'est toujours vide pour toi.

Mise à jour

Voici javascript j'ai trouvé sur this site, qui crée les en-têtes nécessaires/limites pour un téléchargement de fichier. Je ne sais pas si cela fonctionnera pour vous, mais il peut:

function fileUpload(url, fileData, fileName) { 
    var fileSize = fileData.length, 
    boundary = "xxxxxxxxx", 
    xhr = new XMLHttpRequest(); 

    xhr.open("POST", url, true); 
      // simulate a file MIME POST request. 
    xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); 
    xhr.setRequestHeader("Content-Length", fileSize); 

    var body = "--" + boundary + "\r\n"; 
    body += 'Content-Disposition: form-data; name="contents"; filename="' + fileName + '"\r\n'; 
    body += "Content-Type: application/octet-stream\r\n\r\n"; 
    body += fileData + "\r\n"; 
    body += "--" + boundary + "--"; 

    xhr.send(body); 
    return true; 
} 
+0

J'ai déjà essayé. Si vous voyez mon code, cette ligne est commentée. Il n'apparaît pas même si je change d'utilisation multipart/form-data au lieu de application/octet-stream – Arun

+0

Vous pouvez avoir d'autres problèmes qui sont en jeu ici, mais c'est sûr si le type de contenu ne vient pas en tant que multipart/form- données, il ne sera jamais rempli. J'ai regardé la méthode interne ASP.NET utilise pour remplir la collection de fichiers et il est spécifiquement à la recherche de cela. – patmortech

+0

Merci. J'ai juste essayé un contrôle de téléchargement de fichier régulier et trouvé une petite différence dans les en-têtes. Le téléchargement normal contient le type de contenu suivant = multipart/form-data; boundary = ---- WebKitFormBoundaryMaOZwv8AOdCyW0Mc. Alors que le xhr contient juste Content-Type = multipart/form-data ;. La limite est manquante. Cela peut-il être la cause? Je ne peux pas ajouter la limite moi-même. Il semble être une chaîne générée aléatoirement – Arun