http - Haskell Network.HTTP 错误地下载图像

标签 http haskell 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

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

最佳答案

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

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

至于解决这个问题,较新版本的 HTTP 的返回类型是多态的,并且可以处理返回 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

获取多态 Request 的构造有点笨拙。如果issue #1永远得到修复,然后使用 getRequest url 就足够了。

关于http - Haskell Network.HTTP 错误地下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11514671/

相关文章:

http - JMeter中如何读取 "Graph Result"

http - 如果请求是 HEAD,If-Modified-Since HTTP Header 应该返回什么响应?

list - Haskell 递归地将函数应用于除第一个元素之外的每个元素?

gradle - Gradle构建-解决下载文件中的依赖关系

c# - 为什么有下载并发数限制?

android - 我在哪里可以学习在 android 中发出 http 请求?

HTTP 'Get' 安全

regex - 需要 Haskell 正则表达式帮助

list - 嵌套列表中的 Haskell `elem`

java - GWT 下载 Excel .xlsx 给我一个损坏的文件