Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Network.HTTP错误下载图像_Http_Haskell_Download - Fatal编程技术网

Haskell Network.HTTP错误下载图像

Haskell Network.HTTP错误下载图像,http,haskell,download,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 impor

我正在尝试使用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
import Network.HTTP
main=do
jpg>=getResponseBody
输出文件显示在当前目录中,但无法在chromium或ristretto下显示。Ristretto报告“解释JPEG图像文件时出错(不是JPEG文件:以0c3 0xbf开头)”

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

为了解决这个问题,较新版本的
HTTP
在返回类型上是多态的,并且可以处理通过testring返回
中的原始字节。您只需要更改将字节写入文件的方式,这样它就不会推断您需要一个
字符串

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
导入符合条件的数据.ByteString作为B
导入网络.HTTP
导入Network.URI(parseURI)
main=do
jpg错误$“无效URI:++url
只有你->你在
simpleHTTP(defaultGETRequest\uUri)>>=getResponseBody

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

您的回答有点不正确,因为
getRequest
返回一个
Request\u字符串,这会阻止它多态。我将在适合我的版本中进行编辑。
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