在MVC3下载更改文件名

问题描述:

问题:我从数据库中其ID命名的文件。当有人想减少它时,我需要将它改为它的真名。服务器上的文件看起来像例如:http://localhost:34256/Content/uploads/23。因此,例如我的文件名是,但我需要将其更改为textfile1.txt在MVC3下载更改文件名

我已创建了这些文件的列表中的部分观点:

@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

您可以在此[文章]通过HTTP标头更改文件名,如(HTTP:/ /*.com/questions/93551/how-to-encode- content-disposition-header-in-http) – Madd0g

+0

Content-Disposition可用于指定文件名。看看http://*.com/questions/5826649/returning-a-file-to-view-download-in-mvc –

您可以创建一个控制器行动,这将有助于该文件:

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>  
} 
+0

它完美地工作。非常感谢! – Marta

你不能做到这一点在链接到文件。您必须通过在将文件传回客户端的响应中设置Content-Disposition标题来完成此操作。

请参阅本SO张贴更多的信息:https://*.com/q/3102276/280222

由于您使用MVC,你可以创建一个返回FileContentResult的动作。

阅读这篇文章的详细信息:http://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Files

下面的代码片断是从文章中提取。请注意,您可以控制文件名属性:

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); 
} 
+0

的OP的实际文件并不存储到数据库中。它们驻留在〜/ Content/uploads文件夹中。 –

+0

fileContent变量包含要作为文件提供的流。 fileName定义了文件的所需名称。您可以通过任何您需要的方式设置这些变量以实现相同的目的,从任何来源提供内容。 – agarcian

正如安德斯说,你需要使用Content-Disposition

为此,创建一个控制器衍生物具有.e.g Download的方法,即采用该文件的ID。然后您可以读取ID(并获取原始文件名),并使用FileResult类传递文件(您可以使用FileDownloadName属性设置文件名,该属性将为您设置配置