我尝试使用以下代码。但它没有用。
public FileResult download(string path)
{
return File(path, "application/pdf", Server.UrlEncode(path));
}
我的Ajax代码是:
function fileDownload(path) {
$.ajax({
url: '/Home/download',
data: { path: path },
type: 'POST',
async: false,
success: function (data) { }
});
}
答案 0 :(得分:4)
您通常希望将文件名映射到服务器上的物理路径,例如:假设用户选择文件Foo.pdf
并且所有内容文件都在~/Content
文件夹中:
public FileResult download(string path)
{
string actualPath = Server.MapPath("~/Content/" + path);
return File(actualPath, "application/pdf", Server.UrlEncode(path));
}
但是,从安全角度来看,允许用户直接指定文件名是可疑的 - 您可能想要考虑其他替代方法,例如可用文件的表或字典,并强制浏览器选择其中一个通过密钥提供的可用文件 - 恶意用户可以通过这种方式搜索那些无法提供服务的文件。
编辑,看到OP想要Ajax
对文档进行Ajax化应该可行,尽管以这种方式下载不会呈现PDF - 您需要将文档传递给可编写脚本的PDF查看器或类似文件。
您可以改为生成一个简单的链接,按钮或图像,用户可以单击以调用控制器操作并下载PDF:
而不是文档化。 @Html.ActionLink("Click to download", "download", new {path = "MyNicePDF.pdf"})
答案 1 :(得分:1)
使用window.location方法完成此任务。
此外,您可以使用HTML标记:
<a href="Path" download="Filename">download me</a>
答案 2 :(得分:1)
function DownloadAndReturnBackAttachment(linkHref) {
$.fileDownload(linkHref, {
successCallback: function (url) {
gvScanDocuments.PerformCallback();
gvScanDocuments.UnselectRows();
},
failCallback: function (url) {
alert("A file download error has occurred, please try again.");
gvScanDocuments.PerformCallback();
gvScanDocuments.UnselectRows();
}
});
}
答案 3 :(得分:0)
public FileResult Download(string path)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(path);
string fileName = "your file name";
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}