15

我正在将数据从服务器流式传输到客户端以使用filestream.write. 在这种情况下,我可以下载该文件,但它在我的浏览器中没有显示为下载。“另存为”的弹出窗口都不会出现,“下载栏”也不会出现在“下载”部分。环顾四周,我想我需要在响应标头中包含“某物”,以告诉浏览器此响应有附件。我也想设置cookie。为了做到这一点,这就是我正在做的事情:

        [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");
    }

我收到错误消息:“System.web.httpcontext.current 是一个属性,被用作一种类型。”

我是否在正确的位置更新标题?有没有其他方法可以做到这一点?

4

5 回答 5

17

是的,你做错了试试这个,你应该在你的动作中添加标题,而不是作为属性标题添加到你的方法中。

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

或者

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

更新 据我所知,您正在对您的控制器/动作进行 ajax 调用,这将无法通过直接调用动作来下载文件。您可以通过这种方式实现它。

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";
        }

或者

    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"
        };
    }

在您的 JS 按钮单击中,您可以执行与此类似的操作。

 $('#btnDownload').click(function () {
            window.location.href = "controller/download?name=yourargument";
    });
于 2013-04-18T23:23:21.823 回答
5

请看这里

以下摘自参考网站。

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

编辑1:

从我们的好 ol' SO 中添加一些您可能更感兴趣的东西。您可以在此处查看完整的详细信息。

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);
}
于 2013-04-18T23:24:50.133 回答
0

改变:

return RedirectToAction("Index");

至:

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

并将 return 语句移动到您的 using 语句中。

于 2013-04-18T23:26:10.557 回答
0

过去,我建立了一个白名单,以允许某些域对我的网站进行 iframe。请记住 Google 用于 iframe 网站的图像缓存。

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);
        }
    }
于 2015-06-29T21:45:41.160 回答
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;
    }
于 2016-12-14T12:57:38.810 回答