2013-04-18 6 views
8

Ich streame Daten vom Server zum Client zum Download mit filestream.write. In diesem Fall ist es möglich, dass ich die Datei herunterladen kann, sie erscheint jedoch nicht als Download in meinem Browser. Weder das Pop-up für "Speichern unter" erscheint, noch "Download-Leiste" erscheint im Download-Bereich. Wenn ich mich umsehe, denke ich, dass ich etwas in den Antwort-Header einfügen muss, um dem Browser mitzuteilen, dass es einen Anhang mit dieser Antwort gibt. Auch ich möchte den Cookie setzen. Um dies zu erreichen, ist es das, was ich tue:Hinzufügen von Header zu HTTP-Antwort in einer Aktion in einem Controller in asp.net/mvc

 [HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)] 
    public ActionResult Download(string name) 
    { 
      // some more code to get data in inputstream. 

      using (FileStream fs = System.IO.File.OpenWrite(TargetFile)) 
      { 
       byte[] buffer = new byte[SegmentSize]; 
       int bytesRead; 
       while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0) 
       { 
        fs.WriteAsync(buffer, 0, bytesRead); 
       } 
      } 
     } 
     return RedirectToAction("Index"); 
    } 

ich Störung erhalte, dass: „System.web.httpcontext.current eine Eigenschaft und wird als Typ verwendet“

Mache ich die Header-Aktualisierung am richtigen Ort? Gibt es einen anderen Weg, dies zu tun?

Antwort

11

Ja, Sie tun es in die falsche Richtung versuchen Sie dies, sollten Sie den Header innerhalb Ihrer Aktion nicht als Attribut-Header zu Ihrer Methode hinzufügen.

HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name) 

oder

Request.RequestContext.HttpContext.Response.AddHeader("Content-Disposition", "Attachment;filename=" & name) 

aktualisieren Wie ich verstehe Sie machen einen Ajax-Aufruf zu Ihrem Controller/Aktion, die durch die Arbeit für Datei herunterladen pflegt eine Aktion direkt aufrufen. Sie können es auf diese Weise erreichen.

public void Download(string name) 
     { 
//your logic. Sample code follows. You need to write your stream to the response. 

      var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
      var stream = new MemoryStream(filestream); 
      stream.WriteTo(Response.OutputStream); 
      Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf"); 
      Response.ContentType = "application/pdf"; 
     } 

oder

public FileStreamResult Download(string name) 
    { 
     var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
     var stream = new MemoryStream(filestream); 


     return new FileStreamResult(stream, "application/pdf") 
     { 
      FileDownloadName = "targetfilename.pdf" 
     }; 
    } 

In Ihrem JS Schaltfläche klicken, können Sie einfach etwas Ähnliches tun dies.

$('#btnDownload').click(function() { 
      window.location.href = "controller/download?name=yourargument"; 
    }); 
+0

Ich habe versucht, dies zu tun.Es wird jedoch weder das Dialogfeld "Speichern unter" noch die Download-Fortschrittsleiste im Download-Bereich des Browsers angezeigt. – ezile

+0

Das funktioniert für mich und ich sehe die Ansicht html heruntergeladen in meinem Testfall. Für Sie könnte es daran liegen, dass Sie zur Aktion umleiten. Ich habe dieses Szenario jedoch nicht ausprobiert. Versuchen Sie einfach diese Kopfzeile unter Index zu platzieren. – PSL

+0

Ich werde ein bisschen mehr Details. Ich bin auf der Seite "Index" und klicke dann auf Herunterladen, die dann Download-Aktion über JavaScript aufrufen. Der obige Code ist in Download-Aktion geschrieben. Und nachdem ich die Datei an den Benutzer gestreamt habe, leite ich auf die Seite Index um. Ich bin verwirrt wie in wann soll ich Browser sagen, dass es einen Download gibt. Ich meine, ich sende das Zeug mit FileStream.WriteSync, also denke ich, dass ich dem Browser mitteilen muss, bevor ich die Datei sende, dass es einen Anhang gibt, und dadurch wird das "Speichern unter" -Dialogfenster geöffnet. Ich denke, ich bin hier im Workflow verwirrt und weiß daher nicht wann und wo ich Änderungen vornehmen soll. – ezile

3

Bitte werfen Sie einen Blick auf here.

Folgendes ist von referenzierten Website genommen.

public FileStreamResult StreamFileFromDisk() 
{ 
    string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/"; 
    string fileName = "test.txt"; 
    return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName); 
} 

Edit 1:

Hinzufügen von etwas, das mehr von Ihrem Interesse unserer guten alten SO sein könnte. Sie können nach vollständigen Details überprüfen here.

public ActionResult Download() 
{ 
    var document = ... 
    var cd = new System.Net.Mime.ContentDisposition 
    { 
     // for example foo.bak 
     FileName = document.FileName, 

     // always prompt the user for downloading, set to true if you want 
     // the browser to try to show the file inline 
     Inline = false, 
    }; 
    Response.AppendHeader("Content-Disposition", cd.ToString()); 
    return File(document.Data, document.ContentType); 
} 
0

Wechsel:

return RedirectToAction("Index"); 

zu:

return File(fs, "your/content-type", "filename"); 

Und die Rückkehr-Anweisung in Ihrer Anweisung using bewegen.

0

In der Vergangenheit habe ich eine Whitelist erstellt, um einigen Domains zu erlauben, meine Site zu iframen. Merken Sie sich den Bilder-Cache von Google, der auch für Iframes verwendet wird.

static HashSet<string> frameWhiteList = new HashSet<string> { "www.domain.com", 
                "mysub.domain.tld", 
                "partner.domain.tld" }; 

    protected void EnforceFrameSecurity() 
    { 
     var framer = Request.UrlReferrer; 
     string frameOptionsValue = "SAMEORIGIN"; 

     if (framer != null) 
     { 
      if (frameWhiteList.Contains(framer.Host)) 
      { 
       frameOptionsValue = string.Format("ALLOW-FROM {0}", framer.Host); 
      } 

     } 

     if (string.IsNullOrEmpty(HttpContext.Current.Response.Headers["X-FRAME-OPTIONS"])) 
     { 
      HttpContext.Current.Response.AppendHeader("X-FRAME-OPTIONS", frameOptionsValue); 
     } 
    } 
0
public FileResult DownloadDocument(string id) 
     { 
      if (!string.IsNullOrEmpty(id)) 
      { 
       try 
       { 
        var fileId = Guid.Parse(id); 

       var myFile = AppModel.MyFiles.SingleOrDefault(x => x.Id == fileId); 

       if (myFile != null) 
       { 
        byte[] fileBytes = myFile.FileData; 
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, myFile.FileName); 
       } 
      } 
      catch 
      { 
      } 
     } 

     return null; 
    } 
Verwandte Themen