更改MVC3中下载的文件名
本文关键字:文件名 下载 MVC3 更改 | 更新日期: 2023-09-27 18:15:47
问题:我从数据库中以他们的Id命名的文件。当有人想要下载它时,我需要把它改成它的真实名字。服务器上的文件看起来像:http://localhost:34256/Content/uploads/23。因此,例如我的文件名是23,但我需要将其更改为textfile1.txt。
我已经创建了一个包含这些文件列表的局部视图:
@foreach (var item in Model)
{
<a href="/Content/uploads/@item.Id" title="@Html.Encode(item.FileName)">
<img src="@item.IcoSrc" /><br />
@item.FileName
</a>
}
其中@item.FileName
为文件的真实名称。当有人从这个列表中下载文件时,他得到的文件名为@item。Id而不是@item.FileName。我怎样才能改变呢?
我正在使用MVC3和。net framework 4。
任何帮助都非常感谢!
您可以创建一个控制器操作来为文件服务:
public ActionResult Download(string id, string name)
{
var file = Server.MapPath("~/Content/uploads/" + id);
return File(file, "application/octet-stream", name);
}
,然后指向这个控制器动作的链接:
@foreach (var item in Model)
{
<a href="@Url.Action("Download", new { id = item.Id, name = item.FileName })" title="@Html.Encode(item.FileName)">
<img src="@item.IcoSrc" /><br />
@item.FileName
</a>
}
由于您使用MVC,您可以创建一个返回FileContentResult
的操作。
阅读本文了解详细信息:http://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Files
下面的代码片段摘自那篇文章。注意,您可以控制filename属性:
public FileContentResult GetFile(int id)
{
SqlDataReader rdr; byte[] fileContent = null;
string mimeType = "";string fileName = "";
const string connect = @"Server=.'SQLExpress;Database=FileTest;Trusted_Connection=True;";
using (var conn = new SqlConnection(connect))
{
var qry = "SELECT FileContent, MimeType, FileName FROM FileStore WHERE ID = @ID";
var cmd = new SqlCommand(qry, conn);
cmd.Parameters.AddWithValue("@ID", id);
conn.Open();
rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
fileContent = (byte[])rdr["FileContent"];
mimeType = rdr["MimeType"].ToString();
fileName = rdr["FileName"].ToString();
}
}
return File(fileContent, mimeType, fileName);
}
您不能在文件链接中这样做。你必须通过在响应中设置一个Content-Disposition
头来实现这一点,将文件传递回客户端。
查看这篇文章获取更多信息:https://stackoverflow.com/q/3102276/280222
正如Anders所说,您需要使用Content-Disposition
。
要做到这一点,创建一个控制器衍生物,它有一个方法。g Download
,它接受文件的ID。然后,您可以读取ID(并获得原始文件名),并使用FileResult
类来传递文件(您可以使用FileDownloadName
属性设置文件名,该属性将为您设置处置。