writeFile :: FilePath -> String -> IO ()
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
ポリモーフィックな Request を取得するための構造は少しぎこちないです。問題#1が修正された場合は、使用でgetRequest url
十分です。