我正在尝试在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
}
答案 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);