如何:下载在 C# 中保留原始名称的文件?

Posted

技术标签:

【中文标题】如何:下载在 C# 中保留原始名称的文件?【英文标题】:Howto: download a file keeping the original name in C#? 【发布时间】:2012-11-02 18:30:17 【问题描述】:

我在服务器上有文件,可以通过如下格式的 URL 访问这些文件: http://地址/Attachments.aspx?id=GUID

我可以访问 GUID,并且需要能够将多个文件下载到同一个文件夹。

如果您将该 URL 放入浏览器中,您将下载该文件,该文件将具有原始文件名。

我想在 C# 中复制这种行为。我尝试过使用 WebClient 类的 DownloadFile 方法,但是你必须指定一个新的文件名。更糟糕的是,DownloadFile 会覆盖现有文件。我知道我可以为每个文件生成一个唯一的名称,但我真的很喜欢原始名称。

是否可以下载保留原始文件名的文件?

更新:

使用下面的精彩答案来使用 WebReqest 类,我想出了以下完美的方法:

    public override void OnAttachmentSaved(string filePath)
    
        var webClient = new WebClient();

        //get file name
        var request = WebRequest.Create(filePath);
        var response = request.GetResponse();
        var contentDisposition = response.Headers["Content-Disposition"];
        const string contentFileNamePortion = "filename=";
        var fileNameStartIndex = contentDisposition.IndexOf(contentFileNamePortion, StringComparison.InvariantCulture) + contentFileNamePortion.Length;
        var originalFileNameLength = contentDisposition.Length - fileNameStartIndex;
        var originalFileName = contentDisposition.Substring(fileNameStartIndex, originalFileNameLength);

        //download file
        webClient.UseDefaultCredentials = true;
        webClient.DownloadFile(filePath, String.Format(@"C:\inetpub\Attachments Test\0", originalFileName));            
    

只需要做一些字符串操作就可以得到实际的文件名。我太激动了。谢谢大家!

【问题讨论】:

如果您想要原始文件名,那么您需要另一种服务器,即 FTP 服务器。 @HansPassant:不;他只需要解析Content-Disposition 您不必手动解析 Content-Disposition 标头,.NET 有一个类可以做到这一点 (System.Net.Mime.ContentDisposition) 【参考方案1】:

正如 cmets 中所暗示的,文件名将在 Content-Disposition 标头中可用。不确定在使用WebClient 时如何获取其值,但使用WebRequest 相当简单:

WebRequest request = WebRequest.Create("http://address/Attachments.aspx?id=GUID");
WebResponse response = request.GetResponse();
string originalFileName = response.Headers["Content-Disposition"];
Stream streamWithFileBody = response.GetResponseStream();

【讨论】:

您不必手动解析 Content-Disposition 标头,.NET 有一个类可以做到这一点 (System.Net.Mime.ContentDisposition) 我试过了,我的这个链接是空的 gravatar.com/avatar/…

以上是关于如何:下载在 C# 中保留原始名称的文件?的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何获取程序的当前文件夹名称并将zip文件解压到当前文件夹? [复制]

在 Django 中保留 FileField 的原始文件名

SaveAs期间如何保留原始工作簿

c# 如何获取某个文件所在文件夹的名称

如何直接在浏览器中打开文件,而无需使用文件名在React中下载

如何保留原始文件压缩后的时间戳?