【问题标题】:How can i get a file name from Response.Header ? C#如何从 Response.Header 获取文件名? C#
【发布时间】:2011-09-06 17:42:10
【问题描述】:

这是一个代码,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

【问题讨论】:

  • 您可能希望将 _Response 变量的名称更改为 _Request。是HttpWebRequest,不是HttpWebResponse,叫它_Response有点误导。

标签: c# browser download filenames download-manager


【解决方案1】:

正确的方法是查看 Content-Disposition 字段是否提供了文件名,如果失败,则尝试从 Location 字段中推断文件名。

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

【讨论】:

    【解决方案2】:

    这样做:

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

    这样,文件名将出现在位置标题的末尾。

    【讨论】:

    • 这与 Reed Copsey 的回答非常相似,但只会给出文件名,而不会给出 URL 的其余部分。
    【解决方案3】:

    鉴于您请求的标头,您应该能够做到:

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

    【讨论】:

      【解决方案4】:

      如果你有文件的位置,你可以只提取你想要的标题(在这种情况下,我假设它的索引在4"Location"),然后获取 URL 的最后一部分。

      【讨论】:

        【解决方案5】:

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

        此文件名在“位置”中。

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

        在另一个注意事项上。看来您正在下载文件,在这种情况下无需提供路径。您下载的文件的路径将是您将下载流的内容放入的任何路径。 因此,您保存文件并将其放在您有权放置的任何位置。

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

        希望对你有帮助

        【讨论】:

          【解决方案6】:

          如果一切都失败了,您总是可以解析 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;
              }
          }
          

          【讨论】:

            【解决方案7】:

            从 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;
            

            【讨论】:

            • 我试过了,但是当标头的值类似于attachment; filename*=utf-8''20200217_152840.jpg时失败了
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-25
            • 2017-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多