Как я могу получить имя файла из Response.Header?C # - PullRequest
0 голосов
/ 06 сентября 2011

Это код, 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

Ответы [ 6 ]

2 голосов
/ 06 сентября 2011

Правильный подход состоит в том, чтобы проверить, предоставляется ли имя файла в поле Content-Disposition и, если это невозможно, попытаться вывести имя файла из поля Location.

Будьте в курсеполе местоположения - это просто URL-адрес для запроса на загрузку, и поэтому оно может не включать расширение или даже значимое имя.

2 голосов
/ 06 сентября 2011

Сделай так:

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

Таким образом, у вас будет имя файла в конце заголовка местоположения.

1 голос
/ 06 сентября 2011

Если у вас есть местоположение файла, вы можете просто извлечь нужный заголовок (в этом случае я предполагаю, что он проиндексирован на 4 или на "Location"), а затем взять последнюю часть URL.

1 голос
/ 06 сентября 2011

Учитывая ваши заголовки из вашего запроса, вы должны быть в состоянии сделать:

 string file = result.Headers["Location"];
0 голосов
/ 05 декабря 2018

Если ничего не помогает, вы всегда можете проанализировать 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;
    }
}
0 голосов
/ 06 сентября 2011

Поскольку файл находится на сервере, вы не сможете получить действительное имя файла. Только то, что веб-приложение говорит вам.

Это имя файла находится в "Location".

Однако, так как приложение сообщает вам, что это text / html, оно может форматировать результат, прежде чем оно отправит его вам. Правильный тип MIME для исполняемого файла: application / octet-stream.

На другой ноте. Похоже, вы скачиваете файл, и в этом случае нет необходимости указывать путь. Путь к файлу, который вы загружаете, будет любым путем, в который вы помещаете содержимое загруженного потока. Поэтому вы сохраняете файл и помещаете его туда, где у вас есть доступ.

Когда файл создается, вы должны указать путь, в противном случае он помещается в тот же каталог, что и исполняющий файл, который его вызывает.

Надеюсь, это поможет

...