问题:我的文件名是来自数据库的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 framevork 4。
非常感谢任何帮助!
答案 0 :(得分:7)
您可以创建一个将为文件提供服务的控制器操作:
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>
}
答案 1 :(得分:4)
由于您使用的是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);
}
答案 2 :(得分:1)
您无法在指向该文件的链接中执行此操作。您必须通过在将文件传回客户端的响应中设置Content-Disposition
标头来完成此操作。
有关详细信息,请参阅此SO帖子:https://stackoverflow.com/q/3102276/280222
答案 3 :(得分:0)
正如安德斯所说,你需要使用Content-Disposition
。
为此,请创建一个具有方法.e.g Download
的控制器衍生物,该方法获取文件的ID。然后,您可以读取ID(并获取原始文件名),并使用FileResult
类来传递文件(您可以使用FileDownloadName
属性设置文件名,该属性将为您设置处置。 / p>