我发现以下asp.net代码在从数据库提供文件时非常有用:
Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
Run Code Online (Sandbox Code Playgroud)
这允许用户将文件保存到他们的计算机,然后决定如何使用它,而不是尝试使用该文件的浏览器.
使用内容处置响应标头还可以做些什么?
http httpresponse httpwebresponse content-disposition http-headers
有没有办法在浏览器中使用具有特定名称的ASP.NET MVC FileContentResult来流式传输文件?
我注意到你可以有一个FileDialog(打开/保存),或者你可以在浏览器窗口中流式传输文件,但是当你尝试保存文件时它会使用ActionName.
我有以下场景:
byte[] contents = DocumentServiceInstance.CreateDocument(orderId, EPrintTypes.Quote);
result = File(contents, "application/pdf", String.Format("Quote{0}.pdf", orderId));
Run Code Online (Sandbox Code Playgroud)
当我使用它时,我可以流式传输字节,但是给用户提供了一个OPEN/SAVE文件对话框.我想在浏览器窗口中实际传输此文件.
如果我只使用FilePathResult,它会在浏览器窗口中显示该文件,但是当我单击"保存"按钮将文件保存为PDF时,它会显示操作名称作为文件的名称.
有没有遇到过这个?
出于某些奇怪的原因,我想从控制器操作直接将HTML写入Response流.(我理解MVC分离,但这是一个特例.)
我可以直接写入HttpResponse流吗?在这种情况下,IView控制器操作应该返回哪个对象?我可以退回'null'吗?
我正在使用ASP.NET MVC 3.我有一个控制器动作,返回一个PDF文件,如下所示:
Public Class ReportController
...
Function Generate(id As Integer) As ActionResult
...
Return File(output, "application/pdf", "something.pdf")
' "output" is a memory stream
End Function
Run Code Online (Sandbox Code Playgroud)
代码有效,但Firefox不会在选项卡中显示结果,结果可以使用Adobe Reader下载或打开.
我知道Firefox可以在选项卡中显示PDF,因为我可以谷歌一些PDF,点击链接,PDF将在选项卡中打开.
如何设置操作以便PDF将在选项卡中打开?
我使用中概述的方法从数据库生成一个非常大的.csv文件
它工作正常,达到一定程度.当导出的文件太大时,我会得到一个OutOfMemoryException.
如果我通过修改这样的代码来关闭输出缓冲:
protected override void WriteFile(System.Web.HttpResponseBase response)
{
response.BufferOutput = false; // <--- Added this
this.Content(response.OutputStream);
}
Run Code Online (Sandbox Code Playgroud)
文件下载完成.但是,它比启用输出缓冲时慢几个数量级(在localhost上测量缓冲为true/false的同一文件).
我知道这样做比较慢,但为什么它会慢慢相对爬行呢?我有什么办法可以提高处理速度吗?
UPDATE
也可以选择使用注释中建议的File(Stream stream,String contentType).但是,我不确定如何创建stream.数据是基于数据库查询动态组合的,而MemoryStream将耗尽连续的物理内存.欢迎提出建议.
更新2
在评论中建议,交替从数据库中读取并写入流会导致性能下降.我修改了代码以在单独的线程中执行流写入(使用生产者/消费者模式).性能没有明显差异.
我有发票屏幕,在此屏幕中有可用的订单数量,因此当我们创建发票时,我们需要填写一张表格,所以我想要的解决方案是当我提交此发票表格或单击此提交按钮时 pdf 应以新格式打开标签。我想向您澄清,我们不会将此 pdf 保存在任何地方。
<div class="modal-footer custom-no-top-border">
<input type="submit" class="btn btn-primary" id="createdata" value="@T("Admin.Common.Create")" />
</div>
Run Code Online (Sandbox Code Playgroud)
当我单击此按钮时,pdf 应在新选项卡中打开。
这是pdf代码
[HttpPost]
public virtual ActionResult PdfInvoice(int customerOrderselectedId)
{
var customerOrder = _customerOrderService.GetCustomerOrderById(customerOrderselectedId);
var customerOrders = new List<DD_CustomerOrder>();
customerOrders.Add(customerOrder);
byte[] bytes;
using (var stream = new MemoryStream())
{
_customerOrderPdfService.PrintInvoicePdf(stream, customerOrders);
bytes = stream.ToArray();
}
return File(bytes, MimeTypes.ApplicationPdf, string.Format("order_{0}.pdf", customerOrder.Id));
}
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,此代码会下载 pdf。
谢谢 !!