在 Asp.net MVC 中下载文件

本文关键字:下载 文件 MVC Asp net | 更新日期: 2023-09-27 18:34:44

public ActionResult OpenDocument(int documentID)
{
   Document doc = Model.DocumentServiceHelper.GetSingleDocument(documentID);
   if (doc != null)
   {
       return File(doc.Data, MimeMapping.GetMimeMapping(doc.Name) , doc.Name);
   }
   return Json("No File", JsonRequestBehavior.AllowGet);
}

.JS:

 $('#btnOpenDocument').click(function () {
   var documentID = $('#hidDocumentID').val();
window.location.href = '/Documents/OpenDocument?documentID=' + documentID;
 });

目录:

<input type="hidden" id="hidDocumentID" 
       name="DocumentID" value="ViewData["DocumentId"]" />

我在stackoverflow上尝试了许多文档。无论我尝试什么文件返回(下载(没有"xls,doc等",并且由于路径而无法打开文档。

如何为返回文件或其他解决方案更正此问题

谢谢。

在 Asp.net MVC 中下载文件

任何 Controller.File 中的第二个参数应该是内容类型,但代码似乎试图传递类型和文件名。也许这是一个错字,目的是输入:

return File(doc.Data, MimeMapping.GetMimeMapping(doc.Name), doc.Name)

doc.Data应该是字节数组或 Stream,以避免与 Controller.File(string,string,string( 重载混淆,后者期望第一个参数是服务器文件的路径。

此外,GetMimeMapping应返回有效的 MIME 类型,例如.xlsx文件的 application'octet-streamapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet 等。

浏览器可以通过首先检查内容类型,然后检查文件扩展名,在客户端上打开正确的程序。这意味着 Excel 文件可以作为application'octet-stream发送,但目标名称(在本例中为doc.Name(必须包含正确的扩展名。

最后,为了确保Javascript代码不会搞砸任何东西,应该使用Fiddler或Chrome或IE的网络捕获功能来准确检查发送到服务器的内容以及返回的内容。

返回文件应该像这样完成:

byte[] file = ...
return File(file, System.Net.Mime.MediaTypeNames.Application.Octet, "name");

但是,不返回文件时抛出错误可能并不那么容易。请删除以下行:

return Json("NoFile", JsonRequestBehavior.AllowGet);

。(当然,如果有条件(,然后测试是否可以下载文件。如果下载成功,您可以尝试不返回文件的情况。

还要确保是否文档。数据是一个字节数组。

编辑:

根据您的更新更改:

window.location.href = '/Documents/OpenDocument?documentID=' + documentID;

var url = '@Url.Action("OpenDocument","Documents")';
window.location = url + '?documentID=' + documentID;

不应使用"/Documents/OpenDocument"等路径,因为它可能因路由配置而异。

此外,如果您使用重载的方法 Url.Action,它将采用参数数组并放置在那里 documentID 参数。

请同时更改:

public ActionResult OpenDocument(int documentID)
{
   Document doc = Model.DocumentServiceHelper.GetSingleDocument(documentID);
   if (doc != null)
   {
       return File(doc.Data, MimeMapping.GetMimeMapping(doc.Name) + doc.Name);
   }
   return Json("No File", JsonRequestBehavior.AllowGet);
}

public FileResult OpenDocument(int documentID)
{
   Document doc = Model.DocumentServiceHelper.GetSingleDocument(documentID);
   return File(doc.Data, System.Net.Mime.MediaTypeNames.Application.Octet, doc.Name);
}

和测试解决方案。

然后考虑不返回任何文件的场景。