使用ASP.NET MVC FileContentResult在具有名称的浏览器中使用stream文件?

有没有一种方法来使用具有特定名称的浏览器中的ASP.NET MVC FileContentResultstream文件?

我注意到你可以有一个FileDialog(打开/保存),或者你可以在浏览器窗口中stream式传输文件,但是当你试图保存文件时,它会使用ActionName。

我有以下情况:

byte[] contents = DocumentServiceInstance.CreateDocument(orderId, EPrintTypes.Quote); result = File(contents, "application/pdf", String.Format("Quote{0}.pdf", orderId)); 

当我使用这个,我可以stream的字节,但打开/保存文件对话框给予用户。 我想实际上在浏览器窗口中stream这个文件。

如果我只是使用FilePathResult,它显示在浏览器窗口中的文件,但是当我点击“保存”button来保存文件在PDF中,它显示我动作名称作为文件的名称。

有没有人遇到过这个?

 public ActionResult Index() { byte[] contents = FetchPdfBytes(); return File(contents, "application/pdf", "test.pdf"); } 

并在浏览器中打开PDF,您将需要设置Content-Disposition标题:

 public ActionResult Index() { byte[] contents = FetchPdfBytes(); Response.AddHeader("Content-Disposition", "inline; filename=test.pdf"); return File(contents, "application/pdf"); } 

其实,最简单的方法是做下面的事情…

 byte[] content = your_byte[]; FileContentResult result = new FileContentResult(content, "application/octet-stream") { FileDownloadName = "your_file_name" }; return result; 

这对任何其他人面临这个问题可能是有帮助的。 我终于想出了一个解决scheme。 事实certificate,即使我们使用inline作为“content-disposition”并指定一个文件名,浏览器仍然不使用文件名。 相反,浏览器尝试根据Path / URL解释文件名。

你可以在这个URL上进一步阅读: 使用正确的文件名在浏览器中安全地下载文件

这给了我一个想法,我刚刚创build了我的URL路由,将转换的URL和结束它的文件名称,我想给文件。 因此,例如,我原来的控制器调用只包括传递正在打印的订单的订单ID。 我在期待文件名的格式为Order {0} .pdf,其中{0}是订单ID。 同样的报价,我想报价{0} .pdf。

在我的控制器中,我只是继续添加一个额外的参数来接受文件名。 我在URL.Action方法中传递了文件名作为参数。

然后,我创build了一个新的路线,将该URL映射到格式: http://localhost/ShoppingCart/PrintQuote/1054/Quote1054.pdf

routes.MapRoute("", "{controller}/{action}/{orderId}/{fileName}", new { controller = "ShoppingCart", action = "PrintQuote" } , new string[] { "xxxControllers" } );
routes.MapRoute("", "{controller}/{action}/{orderId}/{fileName}", new { controller = "ShoppingCart", action = "PrintQuote" } , new string[] { "xxxControllers" } ); 

这几乎解决了我的问题。 希望这可以帮助别人!

Cheerz,Anup

以前的答案是正确的:添加行…

 Response.AddHeader("Content-Disposition", "inline; filename=[filename]"); 

…将导致多个Content-Disposition标题被发送到浏览器。 这发生b / c FileContentResult内部应用标题,如果您提供一个文件名。 另外一个非常简单的解决scheme是简单地创buildFileContentResult的子类并覆盖它的ExecuteResult()方法。 下面是一个实例化System.Net.Mime.ContentDisposition类(与内部FileContentResult实现中使用的相同对象)的实例,并将其传递到新类:

 public class FileContentResultWithContentDisposition : FileContentResult { private const string ContentDispositionHeaderName = "Content-Disposition"; public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition) : base(fileContents, contentType) { // check for null or invalid ctor arguments ContentDisposition = contentDisposition; } public ContentDisposition ContentDisposition { get; private set; } public override void ExecuteResult(ControllerContext context) { // check for null or invalid method argument ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName; var response = context.HttpContext.Response; response.ContentType = ContentType; response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString()); WriteFile(response); } } 

在您的Controller或基础Controller ,您可以编写一个简单的帮助器来实例化FileContentResultWithContentDisposition ,然后从您的操作方法调用它,如下所示:

 protected virtual FileContentResult File(byte[] fileContents, string contentType, ContentDisposition contentDisposition) { var result = new FileContentResultWithContentDisposition(fileContents, contentType, contentDisposition); return result; } public ActionResult Report() { // get a reference to your document or file // in this example the report exposes properties for // the byte[] data and content-type of the document var report = ... return File(report.Data, report.ContentType, new ContentDisposition { Inline = true, FileName = report.FileName }); } 

现在文件将被发送到您select的文件名和内容处理标题为“inline; filename = [filename]”的浏览器。

我希望有帮助!

使用ASP.NET MVC将文件stream式传输到浏览器的绝对最简单的方法是:

 public ActionResult DownloadFile() { return File(@"c:\path\to\somefile.pdf", "application/pdf", "Your Filename.pdf"); } 

这比@ azarc3build议的方法更容易,因为你甚至不需要读取字节。

学分转到: http : //prideparrot.com/blog/archive/2012/8/uploading_and_returning_files#how_to_return_a_file_as_response

**编辑**

显然我的“答案”和OP的问题是一样的。 但是我没有面临他所面临的问题。 可能这是ASP.NET MVC的旧版本的问题?

 public FileContentResult GetImage(int productId) { Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productId); if (prod != null) { return File(prod.ImageData, prod.ImageMimeType); } else { return null; } } 
Interesting Posts