2013-07-01 2 views
0

Я загружаю много изображений с некоторых веб-сайтов. Я могу собрать все источники img, но иногда я получаю источник вроде этого: something.com/folder/123 - где 123 - файл gif, но ссылка не имеет расширения «gif». Когда я сохраняю этот файл, как этотC# загрузка изображения без расширения

link = getLink(); //link = something.com/folder/123 in this example 
myWebClient.DownloadFile(link, link) 

Он сохраняет этот файл gif без расширения. Как я могу получить расширение для этого файла, когда ссылка не предоставляет его? Я пробовал System.IO.Path.GetFileName (ссылка), но он не работает хорошо для таких ссылок.

+0

Вы не можете получить расширение, если оно не предоставляется веб-сервером. Однако вы можете попытаться сделать вывод из этого типа контента. –

ответ

0

Я думаю, что ответ на этот вопрос будет делать то, что вы хотите: how to identify the extension/type of the file using C#?

Это позволит обнаружить следующие типы MIME-тип: http://msdn.microsoft.com/en-us/library/ms775147%28VS.85%29.aspx#Known_MimeTypes

копирование/вставка из него:

[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)] 
    static extern int FindMimeFromData(IntPtr pBC, 
      [MarshalAs(UnmanagedType.LPWStr)] string pwzUrl, 
     [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1, SizeParamIndex=3)] 
     byte[] pBuffer, 
      int cbSize, 
      [MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed, 
      int dwMimeFlags, 
      out IntPtr ppwzMimeOut, 
      int dwReserved); 

Использование образца:

/// <summary> 
/// Ensures that file exists and retrieves the content type 
/// </summary> 
/// <param name="file"></param> 
/// <returns>Returns for instance "images/jpeg" </returns> 
public static string getMimeFromFile(string file) 
{ 
    IntPtr mimeout; 
    if (!System.IO.File.Exists(file)) 
    throw new FileNotFoundException(file + " not found"); 

    int MaxContent = (int)new FileInfo(file).Length; 
    if (MaxContent > 4096) MaxContent = 4096; 
    FileStream fs = File.OpenRead(file); 


    byte[] buf = new byte[MaxContent];   
    fs.Read(buf, 0, MaxContent); 
    fs.Close(); 
    int result = FindMimeFromData(IntPtr.Zero, file, buf, MaxContent, null, 0, out mimeout, 0); 

    if (result != 0) 
    throw Marshal.GetExceptionForHR(result); 
    string mime = Marshal.PtrToStringUni(mimeout); 
    Marshal.FreeCoTaskMem(mimeout); 
    return mime; 
}