2012-06-18 15 views
6

C'è un modo per rilevare l'URL di un'immagine, come:Rilevamento URL dell'immagine in C#/NET

http://mysite.com/image.jpg 

ma con altri formati come bene? Sto usando C# con .NET 4.0.

Qualcosa di simile

bool isImageUrl(string URL){ 
} 

modificare volevo dire se l'URL punta a un'immagine. Ad esempio, l'URL

http://mysite.com/image.jpg 

è un'immagine valida, ma

http://mysite.com/image 

non lo è.

+0

Stai chiedendo come determinare il suffisso del file o se l'oggetto è un'immagine reale? –

+0

Non penso che la modifica lo abbia reso molto più chiaro. Nota che http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG è un'immagine valida. Vuoi anche che restituisca vero? – dodexahedron

+0

Penso che questo link può aiutare a [Link 1] [1] [1]: http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-than-try-catch –

risposta

6

È possibile inviare una richiesta HTTP all'URL (utilizzando HttpWebRequest) e verificare se il reso ContentType inizia con image/.

1

Si può semplicemente controllare la stringa con .EndsWith() per ognuna delle stringhe definite.

Se si desidera sapere se l'oggetto a quell'URL è effettivamente un'immagine, sarà necessario eseguire personalmente la richiesta Web e controllare l'intestazione HTTP del tipo di contenuto.

Anche questo può essere inaccurato, tuttavia, a seconda del server.

+1

Sbagliato. http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG – SLaks

+0

Entrambi possono essere errati o giusti (scaricare tutte le immagini per verificare il loro tipo?), il problema è nella domanda stessa –

+0

È corretto come la domanda permette di essere. Alcuni server Web meno recenti non avranno mappature di tipo MIME corrette, in ogni caso, specialmente per jpeg2000, png e forse alcuni altri formati che finiranno per essere visti come application/octet-stream. – dodexahedron

3

Si potrebbe ovviamente verificare se l'URL termina con un'estensione di file di immagine noto. Tuttavia, un metodo più sicuro è quello di scaricare in realtà la risorsa e verificare, se il contenuto che si ottiene in realtà è un'immagine:

public static bool IsUrlImage(string url) 
{ 
    try 
    { 
     var request = WebRequest.Create(url); 
     request.Timeout = 5000; 
     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       if (!response.ContentType.Contains("text/html")) 
       { 
        using (var br = new BinaryReader(responseStream)) 
        { 
         // e.g. test for a JPEG header here 
         var soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8) 
         var jfif = br.ReadUInt16(); // JFIF marker (FFE0) 
         return soi == 0xd8ff && jfif == 0xe0ff; 
        } 
       } 
      } 
     } 
    } 
    catch (WebException ex) 
    { 
     Trace.WriteLine(ex); 
     throw; 
    } 
    return false; 
} 
+2

Mentre funzionerà, odio incoraggiarlo. Riesci a immaginare il numero di richieste Web che una singola applicazione potrebbe generare su un gruppo di server Web innocenti con qualcosa del genere? So che siamo qui per aiutarti, ma ora mi sento a disagio nel rispondere a questo ... – dodexahedron

+0

Eh? Che cosa ha a che fare la lezione WebRequest con il mio commento?In ogni caso, sì, mi rendo conto che un URI non ha alcun significato innato. Sto semplicemente commentando il fatto che, mentre questa è una soluzione * tecnicamente corretta *, non è necessariamente una * buona * o * la * giusta soluzione, per l'applicazione data. Considera il caso in cui qualcuno costruisce un indice di un gruppo di immagini. Una singola richiesta a una pagina Web con 1000 link immagine su di esso genera quindi 1000 richieste HTTP. Sìì. Ancora una volta, mi rendo conto che siamo qui solo per rispondere alle domande, ma la domanda stessa mi porta a credere che l'uso sarà inelegante. – dodexahedron

+0

Non è diverso. Non volevo fare lo stesso commento sui tre post con la stessa risposta. : P Il mio problema non è con il metodo. Ho semplicemente scelto di metterlo sul tuo post poiché era il miglior esempio dei tre post con la stessa risposta. – dodexahedron

10

È possibile detemine utilizzando il metodo di Http HEAD (senza scaricare l'intera immagine)

bool IsImageUrl(string URL) 
{ 
    var req = (HttpWebRequest)HttpWebRequest.Create(URL); 
    req.Method = "HEAD"; 
    using (var resp = req.GetResponse()) 
    { 
     return resp.ContentType.ToLower(CultureInfo.InvariantCulture) 
        .StartsWith("image/"); 
    } 
} 
+4

Si noti che non tutti i server gestiranno 'HEAD', e che si dovrebbe passare' OrdinalIgnoreCase' a 'StartsWith'. – SLaks