如何从Response.Header获取文件名? C#

时间:2011-09-06 17:42:11

标签: c# browser download filenames download-manager

这是一个代码,C#。

System.Net.HttpWebRequest _Response =
    (HttpWebRequest)System.Net.WebRequest.Create(e.Uri.AbsoluteUri.ToString());
_Response.Method = "GET";
_Response.Timeout = 120000;
_Response.Accept =
    "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
_Response.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
_Response.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
_Response.Headers.Add("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.3");
_Response.AllowAutoRedirect = false;

System.Net.HttpWebResponse result = (HttpWebResponse)_Response.GetResponse();

for (int i = 0; i < result.Headers.Count; i++)
{
    MessageBox.Show(result.Headers.ToString());
}

这就是结果,

Cache-Control: private
Content-Type: text/html
Date: Tue, 06 Sep 2011 17:38:26 GMT
ETag: 
Location: http://fs31.filehippo.com/6428/59e79d1f80a74ead98bb04517e26b730/Firefox Setup 7.0b3.exe
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET

7 个答案:

答案 0 :(得分:2)

这样做:

    string fileName = Path.GetFileName(result.Headers["Location"]);

这样,您就可以在位置标题的末尾找到文件名。

答案 1 :(得分:2)

正确的方法是查看Content-Disposition字段是否提供了文件名,如果没有,则尝试从“位置”字段推断文件名。

请注意,位置字段只是下载请求的URL,因此可能不包含扩展名甚至是有意义的名称。

答案 2 :(得分:1)

根据您的请求提供标题,您应该可以:

 string file = result.Headers["Location"];

答案 3 :(得分:1)

如果你有文件的位置,你可以只提取你想要的标题(在这种情况下,我认为它被编入4"Location"索引),然后取最后一部分网址。

答案 4 :(得分:0)

由于文件位于服务器上,您将无法检索实际文件名。只有Web应用程序告诉您的内容。

此文件名位于“位置”。

但是,由于应用程序告诉您它是text / html,因此可能会在将结果发送给您之前格式化结果。可执行文件的正确mime类型是application / octet-stream。

另一方面。您似乎正在下载文件,在这种情况下无需提供路径。您下载的文件的路径将是您将下载的流的内容放入的任何路径。 因此,您保存文件并将其放在您有权访问的任何地方。

创建文件时,您必须提供路径,否则它将与调用它的可执行文件放在同一目录中。

我希望这会有所帮助

答案 5 :(得分:0)

如果其他所有方法均失败,则始终可以解析WebResponse.ResponseUri.ToString()。使用string.LastIndexOf(“ /”)查找文件名的开头,并使用String.IndexOf查看是否存在“?”。

public static void ExtractFileNameFromUri(string URI, ref string parsedFileName, string fileNameStartDelimiter = "/", string fileNameEndDelimiter = "?")
{
    const int NOTFOUND = -1;

    try
    {
        int startParse = URI.LastIndexOf(fileNameStartDelimiter) + fileNameStartDelimiter.Length;

        if (startParse == NOTFOUND)
            return;

        int endParse = URI.IndexOf(fileNameEndDelimiter);

        if (endParse == NOTFOUND)
            endParse = URI.Length;

        parsedFileName = URI.Substring(startParse, (endParse - startParse));
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        return;
    }
}

答案 6 :(得分:0)

从Content-Disposition字段中检索文件名的简单有效的方法:

using System.Net.Mime;

HttpWebResponse resp = {YOUR RESPONSE}
string dispHeader = resp.GetResponseHeader("content-disposition");
ContentDisposition disp = new ContentDisposition(dispHeader);
string filename = disp.FileName;