更改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。

任何帮助都非常感谢!

更改MVC3中下载的文件名

您可以创建一个控制器操作来为文件服务:

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属性设置文件名,该属性将为您设置处置。