2012-07-17 12 views
11

Sto provando a scaricare le immagini usando il modulo Network.HTTP e con scarso successo.Haskell Network.HTTP che scarica in modo errato l'immagine

import Network.HTTP 

main = do 
    jpg <- get "http://www.irregularwebcomic.net/comics/irreg2557.jpg" 
    writeFile "irreg2557.jpg" jpg where 
     get url = simpleHTTP (getRequest url) >>= getResponseBody 

Il file di output viene visualizzato nella directory corrente, ma non viene visualizzato in cromo o ristretto. Ristretto segnala "Errore nell'interpretazione del file immagine JPEG (non un file JPEG: inizia con 0c3 0xbf)".

risposta

23
writeFile :: FilePath -> String -> IO() 

String. Questo è il tuo problema, proprio lì. String è per testo Unicode. Il tentativo di memorizzare dati binari in esso porterà alla corruzione. Non è chiaro in questo caso se la corruzione viene eseguita da simpleHTTP o da writeFile, ma alla fine non è importante. Stai utilizzando il tipo sbagliato e qualcosa sta corrompendo i dati quando confrontati con byte che non costituiscono una codifica Unicode valida.

Per quanto riguarda il fissaggio, le nuove versioni di HTTP sono di tipo polimorfico nel tipo restituito e possono gestire la restituzione dei byte non elaborati in un ByteString. Hai solo bisogno di cambiare il modo in cui stai scrivendo i byte nel file, in modo che non deduca che vuoi un String.

import qualified Data.ByteString as B 
import Network.HTTP 
import Network.URI (parseURI) 

main = do 
    jpg <- get "http://www.irregularwebcomic.net/comics/irreg2557.jpg" 
    B.writeFile "irreg2557.jpg" jpg 
    where 
    get url = let uri = case parseURI url of 
          Nothing -> error $ "Invalid URI: " ++ url 
          Just u -> u in 
       simpleHTTP (defaultGETRequest_ uri) >>= getResponseBody 

La costruzione per ottenere una richiesta polimorfica è un po 'maldestra. Se issue #1 viene risolto, utilizzare getRequest url sarà sufficiente.

+2

La tua risposta è leggermente errata perché 'getRequest' restituisce un' Request_String', che impedisce di essere polimorfico. Modificherò in una versione che funziona per me. –

+0

Whoops. Buona pesca. E questo è un insetto stupido. – Carl

Problemi correlati