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

4
我有一些文件在服务器上,可以通过以下格式的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服务器。 - Hans Passant
6
不需要;他只需要解析“Content-Disposition”即可。 - SLaks
2
你不需要手动解析Content-Disposition头,.NET有一个类可以做到这一点(System.Net.Mime.ContentDisposition)。 - Daniel Lo Nigro
1个回答

8

正如评论中所暗示的,文件名可在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();

2
您不必手动解析Content-Disposition头,.NET有一个类可以完成此操作(System.Net.Mime.ContentDisposition)。 - Daniel Lo Nigro
我尝试了一下,从这个链接 https://www.gravatar.com/avatar/0e4377279c8f5d9e53cf807ab3f9f717?s=32&d=identicon&r=PG 得到的是 null。 - Mortalus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接