2017-10-20 7 views
0

J'utilise un webgrid et j'ai mis un bouton de téléchargement à l'intérieur pour télécharger un fichier depuis la grille.Pourquoi le téléchargement d'un fichier génère une erreur de disposition multiple?

Mais il génère une erreur: localhost a envoyé une réponse non valide. ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

[HttpGet] 
     public ActionResult DownloadStories() 
     { 

      string filename = "saddam.png"; 
      string filepath = Server.MapPath("~/UploadedFiles/") + filename; //AppDomain.CurrentDomain.BaseDirectory + "/UploadedFiles/" + filename; 
      byte[] filedata = System.IO.File.ReadAllBytes(filepath); 
      string contentType = MimeMapping.GetMimeMapping(filepath); 

      var cd = new System.Net.Mime.ContentDisposition 
      { 
       FileName = filename, 
       Inline = true, 
      }; 

      // Response.AppendHeader("Content-Disposition", cd.ToString()); 
      Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); 

      return File(filedata, contentType, cd.FileName); 


     } 

Vue:

WebGrid wgImages = new WebGrid(listData, rowsPerPage: 20); 
     @wgImages.GetHtml(tableStyle: "table table-condensed table-bordered table-striped table-responsive", 
     columns: wgImages.Columns(
            wgImages.Column 
            (columnName: "Image", header:"Image"), 
            wgImages.Column 
            (columnName:"Story", header: "Story"), 
            wgImages.Column 
            (columnName:"Image", header:"Download", format: (testItem)=> Html.ActionLink("Download", "DownloadStories", "Stories") 

           )) 
     ); 
    } 

J'ai essayé le code que j'ai commenté maintenant et cela ne fonctionne pas trop.

+0

Vérifiez la [documentation] (https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file (v = vs. 118) .aspx # M: System.Web.Mvc.Controller.File% 28System.Byte [], System.String, System.String% 29): "Le paramètre * fileDownloadName * est utilisé pour générer l'en-tête content-disposition. " - donc * vous n'avez pas à * le faire vous-même. –

+0

Essayez de supprimer 'Response.AddHeader (" Content-Disposition "," pièce jointe; nom_fichier = \ "" + nom_fichier + "\" ");' car cela risque de provoquer des en-têtes dupliqués. 'cd.FileName' lui-même déclare déjà' System.Net.Mime.ContentDisposition' qui doit envoyer le fichier dans le navigateur du client. –

+0

@TetsuyaYamamoto ok mais maintenant il ouvre seulement le fichier dans le spectateur ne pas télécharger –

Répondre

0

Pourquoi ne pas utiliser HTML simple & JAVASCRIPT pour télécharger le fichier en faisant un appel ajax

1. Appelez ce funcation par ajax post

[HttpPost] 
     public JsonResult DownloadStories(String someParamsIfany) 
     { 
       //do your thing 

     return Json(file,JsonRequestBehavior.AllowGet); 
     } 

2. Créez un fichier Img avec le data & télécharger sur Html Side

$.ajax({ 
      type: "POST",   
      url: '/Home/DownloadStories', 
      data: {someParamsIfany :someParamsIfany}, 
      success: function (result) { 
       DownLoadTheFile(result); 
      } 
     }); 

3 fonctionnent maintenant DownLoadTheFile

function DownLoadTheFile(file){ 
    var a = document.createElement('a'); 
    a.href = file.filepath ; 
    a.download = file.filename; 
    a.click(); 
}