使用asp.net mvc下载文件

时间:2014-12-15 05:06:02

标签: asp.net-mvc download

我尝试使用以下代码。但它没有用。

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) { } 
    }); 
}

4 个答案:

答案 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);         
}