在 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等",并且由于路径而无法打开文档。
如何为返回文件或其他解决方案更正此问题
谢谢。
任何 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-stream
或 application/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);
}
和测试解决方案。
然后考虑不返回任何文件的场景。