2010-10-26 6 views
1

OK, ça fait longtemps que je m'en sors. J'ai un WebService qui envoie un fichier zip au navigateur. Cela marche; lorsque je teste le WebService et que j'appelle directement la méthode, le fichier zip est téléchargé correctement dans le navigateur. Le problème se pose lorsque j'utilise jQuery pour envoyer une requête AJAX au WebService - le fichier zip est téléchargé dans la réponse, mais il reste dans la réponse et ne se télécharge pas en tant que fichier.Envoi d'un fichier Zip au client via une réponse - un type incorrect est envoyé

Voici mon code:

 HttpContext.Current.Response.ClearHeaders(); 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.ContentType = "application/zip"; 
     HttpContext.Current.Response.AddHeader("content-disposition", "attachment;   filename=pleasework.zip"); 


     using (ZipFile zip = new ZipFile()) 
     { 
      zip.AddDirectory("c:\\inetpub\\mediaserver\\music\\mixes"); 
      zip.AddFile("c:\\test.txt"); 
      zip.AddFile("c:\\test2.txt"); 
      zip.Save("c:\\filename.zip"); 
     } 
     HttpContext.Current.Response.TransmitFile("c:\\iloveshrooms.zip"); 
     return "done";   
} 

Maintenant, cela fonctionne depuis les téléchargements de fichiers lorsque j'utilise la fonction « Invoke » lors de la navigation directement au service.

Voici ma demande jQuery AJAX ...

function getFile() { 
      alert("sending POST request..."); 
      $.ajax({ 
       type: 'POST', 
       url: 'ZipService.asmx/GetZipFile HTTP 1.1', 
       contentType: "application/x-www-form-urlencoded", 
       data: '{ "path":"c:\\inetpub\\mediaserver\\music\\mixes" }', 
       dataType: '', 
       beforeSend: function(xhr) {xhr.setRequestHeader("Accept","application/zip");}, 
       success: function() {alert(":-)");}, 
       failure: function() {alert(":-(");} 
      }); 
     } 

J'ai ajouté le code dans « beforeSend » afin que les états de demande explicitement quel type de réponse, le navigateur devrait attendre. J'ai utilisé Firebug pour surveiller les en-têtes de requête/réponse et je ne vois rien de mal avec eux (sauf quand je regarde le contenu de la réponse, il est plein de données binaires ET c'est la même taille que le fichier J'envoie.

Je viens de télécharger tentais écran-dumps de la demande/têtes de réponse et le contenu du reponse mais je n'ai pas assez de points de réputation pour ce faire encore :-(

La réponse est la même taille du fichier Zip, donc je suppose qu'il est renvoyé au navigateur, mais le navigateur ne sait pas quoi faire avec lui ..

Testé dans IE, FF & Chrome et les résultats sont cohérents.

Si quelqu'un pouvait faire la lumière sur ce sujet, je l'apprécierais grandement!

Répondre

1

Il existe deux solutions simples.

Convertissez votre procédure de serveur pour utiliser une requête GET, vous pouvez utiliser window.open pour initialiser le téléchargement.

window.open('your_procedure_url?parameter=xyz') 

Si vous voulez coller avec POST, vous pouvez créer une forme cachée, avec des entrées pour chacun des paramètres. Définissez l'action de formulaire sur POST sur votre URL de service et utilisez form.submit() pour lancer le téléchargement.

0

1er. Ne faites pas un webservice. S'il livre toujours un fichier zip, pourquoi n'est-il pas un aspx ou un ashx? Une ressource demandée par un script n'a pas besoin d'être ASMX.

2ème. ce n'est pas vrai que vous ne pouvez pas recevoir un fichier binaire en AJAX ou javascript. Vous pouvez. Par exemple, voir Unzipping zip archives with Javascript.

Mais assurez-vous que vous voulez réellement gérer le fichier zip dans le script. Dans la plupart des cas, vous voulez laisser l'utilisateur enregistrer le fichier zip dans le système de fichiers.

Questions connexes