更改文件名以便在MVC3中下载

时间:2011-11-27 09:59:09

标签: c# .net asp.net-mvc-3 file-io

问题:我的文件名是来自数据库的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。

非常感谢任何帮助!

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>