2012-07-17 13 views
11

Estoy tratando de descargar imágenes usando el módulo Network.HTTP y teniendo poco éxito.Haskell Network.HTTP descargando incorrectamente la imagen

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 

El archivo de salida aparece en el directorio actual, pero no se muestra en cromo o ristretto. Ristretto informa "Error al interpretar el archivo de imagen JPEG (no es un archivo JPEG: comienza con 0c3 0xbf)".

Respuesta

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

String. Ese es tu problema, allí mismo. String es para texto unicode. Intentar almacenar datos binarios en él dará lugar a la corrupción. No está claro en este caso si la corrupción se está haciendo por simpleHTTP o por writeFile, pero en última instancia no es importante. Está utilizando el tipo incorrecto, y algo está corrompiendo los datos cuando se enfrentan con bytes que no constituyen una codificación Unicode válida.

En cuanto a la fijación de esto, las versiones más recientes de HTTP son polimórficas en su tipo de devolución, y pueden manejar la devolución de los bytes sin formato en un ByteString. Solo necesita cambiar la forma en que está escribiendo los bytes en el archivo, para que no se infiera que quiere 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 construcción para obtener una solicitud polimórfica es un poco torpe. Si issue #1 alguna vez se repara, entonces usará getRequest url será suficiente.

+2

Tu respuesta es un poco incorrecta porque 'getRequest' devuelve' Request_String', lo que impide que sea polimórfica. Editaré en una versión que funcione para mí. –

+0

Whoops. Buena atrapada. Y eso es un error tonto. – Carl

Cuestiones relacionadas