获取没有Content-Disposition的文件名

9

我希望能在网上找到一个解决方案来解决这个问题,可我已经搜索了好几天都没有找到任何有用的信息。

我想用WebClient从Web服务器上下载一个文件。虽然下载本身没有问题,但是我无法获得真正的文件名,而这对我非常重要。

我阅读了许多主页上的内容,其中提到文件名应该保存在Content-Disposition头中。不幸的是,这个站点的头信息为空。我试图使用:

string header_contentDisposition ="";
using (WebClient client = new WebClient())
            {
                client.OpenRead(link);

                header_contentDisposition = client.ResponseHeaders["Content-Disposition"];
                MessageBox.Show(header_contentDisposition);
            }

这个头部没有保存任何信息。

如果我尝试用浏览器(IE、Opera、Chrome)下载文件,文件名会显示在文件对话框中,所以它必须被保存在某个地方。

你能想象我在哪里可以找到它吗?

编辑:我无法从URL中提取它,因为链接是由php生成的,例如

http://www.example.com/download.php?id=10

1
你能转储出那些已经存在的头吗?或者浏览器是从URL默认它的吗? - Jon Skeet
我得到的所有头信息:年龄=292161 连接=保持活动状态 接受范围=字节 内容长度=15953830 缓存控制=最大年龄=31536000 内容类型=应用/vnd.android.package-archive 日期=2012年11月23日星期五09:21:40 GMT 过期=2013年11月23日星期六09:21:40 GMT 上次修改时间=2012年11月23日星期五08:38:35 GMT 服务器=nginx - user1854270
你能给我们一个真实的URL,以便我们可以重现这个问题吗? - Jon Skeet
@user1854270:那只是一个重定向。 - Jon Skeet
我会使用调试器,查看响应的内容,并查看是否有类似文件名的东西。 - Sam I am says Reinstate Monica
显示剩余3条评论
1个回答

18

你可以尝试这样做:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        try
        {

            HttpWebResponse res = (HttpWebResponse)request.GetResponse();
            using (Stream rstream = res.GetResponseStream())
            {
                string fileName = res.Headers["Content-Disposition"] != null ?
                    res.Headers["Content-Disposition"].Replace("attachment; filename=", "").Replace("\"", "") :
                    res.Headers["Location"] != null ? Path.GetFileName(res.Headers["Location"]) : 
                    Path.GetFileName(url).Contains('?') || Path.GetFileName(url).Contains('=') ?
                    Path.GetFileName(res.ResponseUri.ToString()) : defaultFileName;
            }
            res.Close();
        }
        catch { }

http://upload.p-kratzer.com/index.php?dir=&file=asdfasdfwervdcvvedb 上测试过,确实返回了 wetter.JPG 图片。


太好了Lunyx。谢谢你。但是当我将其用于Google Drive链接时,会得到一个很长的结果字符串。例如“attachment;filename=filename.apk;filename*=UTF-8''filename.apk”。 - smedasn
@smedasn 可能是 Google Drive 提供的头部中缺少 attachment;filename= 之间的空格。这不是标准要求的,因此您应该处理这种情况。 - Tom Lint

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