wake-up-neo.com

hinzufügen eines Headers zu einer http-Antwort in einer Aktion innerhalb eines Controllers in asp.net/mvc

Ich streame Daten von Server zu Client zum Herunterladen mit filestream.write. In diesem Fall kann ich die Datei herunterladen, sie wird jedoch nicht als Download in meinem Browser angezeigt. Weder das Popup für "Speichern unter" noch "Download Bar" wird im Downloadbereich angezeigt. Wenn ich mich umsehe, denke ich, muss ich dem Antwortheader "etwas" hinzufügen, um dem Browser mitzuteilen, dass diese Antwort einen Anhang enthält. Ich möchte auch den Cookie setzen. Um dies zu erreichen, mache ich Folgendes:

        [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 erhalte die Fehlermeldung: "System.web.httpcontext.current ist eine Eigenschaft und wird als Typ verwendet."

Mache ich die Header-Aktualisierung an der richtigen Stelle? Gibt es eine andere Möglichkeit, dies zu tun?

9
ezile

Ja, Sie tun es falsch, versuchen Sie dies. Sie sollten den Header Ihrer Aktion nicht als Attribut-Header Ihrer Methode hinzufügen. 

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

oder

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

Update Soweit ich weiß, machen Sie einen Ajax-Aufruf an Ihren Controller/eine Aktion, die nicht zum Herunterladen von Dateien geeignet ist, indem Sie direkt eine Aktion 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-Button-Klick können Sie einfach etwas Ähnliches tun.

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

Bitte schau nach hier .

Folgendes wird von der angegebenen Website übernommen.

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:

Fügen Sie etwas hinzu, das für Sie von unserem guten alten SO mehr interessant sein könnte. Sie können das vollständige Detail hier überprüfen.

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);
}
4
Abhinav

Veränderung:

return RedirectToAction("Index");

zu:

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

Verschieben Sie die return-Anweisung in Ihre using-Anweisung.

0

In der Vergangenheit habe ich eine Whitelist erstellt, um einigen Domains die Möglichkeit zu geben, meine Site zu gestalten. Denken Sie daran, dass der Bild-Cache von Google auch für iframe-Websites verwendet wurde.

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
Wayne
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;
    }
0
akash singla