Haskell Network.HTTP错误地下载图像

Jac*_*lly 12 haskell http download

我正在尝试使用Network.HTTP模块下载图像,但收效甚微.

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
Run Code Online (Sandbox Code Playgroud)

输出文件出现在当前目录中,但无法在chromium或ristretto下显示.Ristretto报告"解释JPEG图像文件时出错(不是JPEG文件:以0c3 0xbf开头)".

Car*_*arl 24

writeFile :: FilePath -> String -> IO ()
Run Code Online (Sandbox Code Playgroud)

String.这是你的问题,就在那里.String用于unicode文本.试图在其中存储二进制数据将导致损坏.在这种情况下,目前尚不清楚腐败是由其进行simpleHTTP还是由进行writeFile,但最终并不重要.你使用了错误的类型,当遇到不构成有效的unicode编码的字节时,有些东西正在破坏数据.

至于修复这个问题,更新版本的HTTP返回类型是多态的,并且可以处理返回a中的原始字节ByteString.您只需要更改将字节写入文件的方式,这样就不会推断出您想要的字节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
Run Code Online (Sandbox Code Playgroud)

获取多态请求的构造有点笨拙.如果问题#1得到修复,那么使用getRequest url就足够了.

  • 你的答案有点不正确,因为`getRequest`返回一个`Request_String`,它阻止它变成多态.我将编辑一个适合我的版本. (2认同)