2013-02-05 60 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