Как получить действительное имя файла и расширение из удаленного URL, чтобы сохранить его.? - PullRequest
1 голос
/ 02 сентября 2011

Я хочу получить фактическое расширение файла с удаленного URL.

иногда расширение не в допустимом формате.

например
У меня проблема с URL-адресами ниже

1) http://tctechcrunch2011.files.wordpress.com/2011/09/media-upload.png?w=266
2) http://0.gravatar.com/avatar/a5a5ed70fa7c651aa5ec9ca8de57a4b8?s=60&d=identicon&r=G

Я хочу загрузить / сохранить удаленный образ с удаленного URL.

Как получить имя файла и расширение из указанного выше URL?

Спасибо
Абхишек

Ответы [ 2 ]

6 голосов
/ 02 сентября 2011

Удаленный сервер отправляет заголовок Content-Type, содержащий MIME-тип ресурса.Например:

Content-Type: image/png

Таким образом, вы можете проверить значение этого заголовка и выбрать правильное расширение для вашего файла.Например:

WebRequest request = WebRequest.Create("http://0.gravatar.com/avatar/a5a5ed70fa7c651aa5ec9ca8de57a4b8?s=60&d=identicon&r=G");
using (WebResponse response = request.GetResponse())
using (Stream stream = response.GetResponseStream())
{
    string contentType = response.ContentType;
    // TODO: examine the content type and decide how to name your file
    string filename = "test.jpg";

    // Download the file
    using (Stream file = File.OpenWrite(filename))
    {
        // Remark: if the file is very big read it in chunks
        // to avoid loading it into memory
        byte[] buffer = new byte[response.ContentLength];
        stream.Read(buffer, 0, buffer.Length);
        file.Write(buffer, 0, buffer.Length);
    }
}
0 голосов
/ 02 сентября 2011

Вы можете использовать VirtualPathUtility , если хотите извлечь расширение из URL.

var ext = VirtualPathUtility.GetExtension(pathstring)

Или использовать заголовки для определения типа контента.Существует Windows API для преобразования типа контента в расширение (оно также есть в реестре), но для веб-приложений имеет смысл использовать сопоставление.

switch(response.ContentType)
{
    case "image/jpeg":
        return ".jpeg";
    case "image/png":
        return ".png";
} 
...