2014-04-24 21 views
5

Sto lavorando su downloader batch ma alcuni URL non inviano dati correttamente.C# Download Immagine da un formato sconosciuto

Per esempio, questa pagina: http://i.imgbox.com/absMQK6A.png

In qualsiasi browser internet, questa pagina mostra un'immagine, ma nel mio programma, download dei dati strani. Penso che questo URL sia falso o protetto (non conosco bene l'HTML.)

BTW, in IE, posso scaricare quell'immagine normalmente con il tasto destro del mouse e salvare come immagine. quindi voglio emulare quel comportamento nel mio programma.

Come posso fare questo?

Di seguito è parte del codice del mio programma.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
if (Proxy != null) 
{ 
    request.Proxy = Proxy; 
} 
if (!string.IsNullOrWhiteSpace(UserAgent)) 
{ 
    request.UserAgent = UserAgent; 
} 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream downloadHttpStream = response.GetResponseStream(); 
int read = downloadHttpStream.Read(buffer, 0, buffer.Length); 
// output codes 

UserAgent è una stringa che fornisce informazioni sul browser. come IE, Firefox, ecc.

Grazie.

risposta

4

Se si guardano i primi byte dei dati si torna con il codice, si può vedere che inizia con 1F 8B 08. This indicates che i dati sono dati gzip (la codifica gzip è una cosa comune sul web). È possibile includere la proprietà AutomaticDecompression per rendere il.Codice netto decomprimere automaticamente questi dati e ottenere i vostri validi PNG (i byte cominciano con 89 50 4E 47):

var request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
+0

Ah! questo è molto intelligente! non sapevo che puoi fare la decompressione automatica ed estrarre il png! – Aviatrix

+0

Grazie mille! – donggas90

0

non sono sicuro se questo è ciò che si voleva, anche se fare un tentativo

Image img; 
var request = WebRequest.Create(DownloadAddress); 

using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
{ 
    img = Bitmap.FromStream(stream); 
} 

Non so se si desidera caricare in realtà o semplicemente scaricarlo, ma in questo modo avrete essere in grado di verificare facilmente se è fattibile

img.Save(somePath); 
+0

Grazie per la risposta. Ma lancia un 'ArgumentException' a' img = Bitmap.FromStream (stream); '. – donggas90

0

non si ottiene un'immagine perché è in Base64, con this online converter è possibile incollare la risposta dal sito e convertirlo in immagine solo per il test.

Inoltre, i browser hanno il supporto integrato per le immagini codificate Base64. Sono spesso usati per incorporare piccole icone in linea per evitare richieste HTTP aggiuntive.

come il modo per risolvere il problema:

  1. tenta di scaricare l'immagine come al solito
  2. verifica se ha funzionato (provare cattura per le eccezioni e verificare la dimensione)
  3. se ci sono eccezioni cercare di convert it from base64 like this
  4. se questo non funziona mostrare un errore o salvare il percorso dell'immagine da qualche parte per l'ispezione in seguito

Inoltre, è possibile aggiungere il supporto per le immagini WebP poiché stanno diventando sempre più popolari. C'è una biblioteca WebP per NET on codeplex

+0

Grazie per la risposta. Questo era il punto! ma ora hai problemi a convertire i byte nella stringa C#. 'b64 = Encoding.ASCII.GetString (pageData.ToArray());' result non è valido Base64. – donggas90

+0

@JIH Si prega di fare riferimento al codice di Tim per una soluzione di codice migliore :) ma si dovrebbero comunque avere controlli diversi per cose diverse :) – Aviatrix

0

Ebbene si può sempre scaricare l'immagine utilizzando

var webClient = new WebClient(); 
byte[] buffer = webClient.DownloadData("http://i.imgbox.com/absMQK6A.png"); 
Problemi correlati