11

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

出力ファイルは現在のディレクトリに表示されますが、クロムまたはリストレットでは表示されません。リストレットは、「JPEG 画像ファイルの解釈中にエラーが発生しました (JPEG ファイルではありません: 0c3 0xbf で始まります)」と報告します。

4

1 に答える 1

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

String. それはあなたの問題です。StringUnicode テキスト用です。バイナリ データを格納しようとすると、破損につながります。この場合、破損が によって行われたの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

ポリモーフィックな Request を取得するための構造は少しぎこちないです。問題#1が修正された場合は、使用でgetRequest url十分です。

于 2012-07-17T01:28:27.600 に答える