2013-02-05 90 views
1

我與MVC 2010速成創造C#的應用程序,並在某些時候,用戶可以上傳文件,並打開一個特定的名稱/下載到/來自數據庫。
下面是我在其中存儲文件表:下載文件,使用mvc2010

CREATE TABLE [dbo].[tClientsFiles]( 
    [IdClient] [int] NOT NULL, 
    [IdFile] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](256) NULL, 
    [Type] [varchar](256) NULL, 
    [Lenght] [money] NULL, 
    [Content] [varbinary](max) NULL, 
    [DateAdd] [datetime] NULL, 
    [UserAdd] [varchar](50) NULL) 

在tClientsFiles.Name,我存儲與文件的路徑和名稱:uploadFile.FileName;,其中uploadFileHttpPostedFileBase。因此,對於insance,如果該文件是Test.txt,它是在用戶的桌面,它存儲C:\Users\user\Desktop\test.txt

然後,當觀看/下載文件,我有一個鏈接到ActionResult在我Controller

public ActionResult GetFile(int id) 
    { 
     var file = dre.tClientsFiles.First(m => m.IdFile == id); 

     MemoryStream ms = new MemoryStream(file.Content, 0, 0, true, true); 
     Response.ContentType = file.Type; 
     Response.AddHeader("content-disposition", "attachment;filename=" + file.Name); 
     Response.Buffer = true; 
     Response.Clear(); 
     Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
     Response.OutputStream.Flush(); 
     Response.End(); 
     return new FileStreamResult(Response.OutputStream, file.Type); 
    } 

當打開文件時,它將其命名爲「Name」file.Name,如下所示:c_Users_user_Desktop_Test

我的問題是:有沒有辦法(也許修改我Response.AddHeader),以命名它只是它的「真名」?(我的意思是,在我們的例子:Test
或者可能的方式來商店的名稱以不同的方式,使其只存儲它的「真名」,而不是名稱和它的整個路徑?

非常感謝您的時間!

回答

2

嘗試

Response.AddHeader("content-disposition", "attachment;filename=" + Path.GetFileName(file.Name)); 
+0

正是我所需要的!非常感謝! (更改GetFileName GetFileName,原因如果不是它不承認它) – eryel

+0

糟糕。應該檢查,而不是從內存中去... – Pete

1

如果你想要的文件名不帶擴展名即.TXT位則

Response.AddHeader("content-disposition", "attachment;filename=" + Path.GetFileNameWithoutExtension(file.Name)); 

路徑是在System.IO命名空間。

+0

我刪除了我以前的評論,因爲我意識到這也是一個有效的答案,但沒有擴展名。對不起,昨天我很匆忙。因爲我不能給出2個被接受的答案,所以我把它交給了這裏評論的第一個答案。非常感謝您的時間! – eryel