2011-11-27 92 views
3

問題:我從數據庫中其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:/ /stackoverflow.com/questions/93551/how-to-encode- content-disposition-header-in-http) – Madd0g

+0

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

回答

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

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

1

你不能做到這一點在鏈接到文件。您必須通過在將文件傳回客戶端的響應中設置Content-Disposition標題來完成此操作。

請參閱本SO張貼更多的信息:https://stackoverflow.com/q/3102276/280222

4

由於您使用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

0

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

爲此,創建一個控制器衍生物具有.e.g Download的方法,即採用該文件的ID。然後您可以讀取ID(並獲取原始文件名),並使用FileResult類傳遞文件(您可以使用FileDownloadName屬性設置文件名,該屬性將爲您設置配置