创建文件下载功能

时间:2012-05-25 07:47:56

标签: asp.net asp.net-mvc

我正在尝试在MVC操作中创建下载功能,并且实际下载有效,但文件以actionname作为文件名保存,例如从下面的代码我得到'DownloadMP3'的文件名。有人在下载时知道如何保留原始文件名吗?

[Authorize]
    public virtual FileResult DownloadMP3(string fileName)
    {
        //Actions/Download?filename=test

        //test 
        string filePath = @"~/Content/xxxxx/" + fileName + ".mp3";

        Response.AddHeader("content-disposition", "attachment;" + filePath + ";");

        return File(filePath, "audio/mpeg3");

        //for wav use audio/wav

    }

3 个答案:

答案 0 :(得分:1)

Content-Disposition标头的正确语法如下:

Content-Disposition: attachment; filename=foo.mp3

但是在这种情况下你可以简单地使用File方法的重载,它接受3个参数,第三个是文件名。它将自动发出包含附件的Content-Disposition标头,这样您就不需要手动添加它(并在语法中犯错误)。

此外,您的filePath变量必须指向服务器上的物理文件,而不是相对网址。请使用Server.MapPath

public virtual ActionResult DownloadMP3(string fileName)
{
    var downloadPath = Server.MapPath("~/Content/xxxxx/");
    fileName = Path.ChangeExtension(Path.GetFileName(fileName), "mp3");
    var file = Path.Combine(downloadPath, fileName);
    return File(file, "audio/mpeg3", fileName);
}

答案 1 :(得分:0)

只需将文件名放在内容处置中,而不是虚拟路径:

    string fileOnly = fileName + ".mp3";
    string filePath = @"~/Content/xxxxx/" + fileOnly;

    Response.AddHeader("content-disposition", "attachment;" + fileOnly + ";");

答案 2 :(得分:0)

尝试添加第三个参数

return File(file.FullPath, file.MimeType, file.FullName);