我正在尝试使用haxr 3000.8.5 使用 metaWeblog API 将图像上传到WordPress博客——特别是newMediaObject方法。
我已经让它适用于小图像,成功上传了 PNG 和 JPG 格式的 20x20 图标。但是,当我尝试中等大小的图像(例如,300x300)时,我得到了一个ErrorClosed异常,大概来自HTTP包(我做了一些源代码潜水,发现 haxr 最终调用了Network.HTTP.simpleHTTP)。
任何人都可以阐明呼叫simpleHTTP可能失败的原因ErrorClosed吗?也欢迎提出尝试和潜在解决方法的建议。
以下是成功上传和不成功上传的完整 tcpdump 输出的链接。
(已清理的)代码也显示在下面,以防万一。
import Network.XmlRpc.Client (remote)
import Network.XmlRpc.Internals (Value(..), toValue)
import Data.Char (toLower)
import System.FilePath (takeFileName, takeExtension)
import qualified Data.ByteString.Char8 as B
import Data.Functor ((<$>))
uploadMediaObject :: FilePath -> IO Value
uploadMediaObject file = do
media <- mkMediaObject file
remote "http://someblog.wordpress.com/xmlrpc.php" "metaWeblog.newMediaObject"
"default" "username" "password" media
-- Create the required struct representing the image.
mkMediaObject :: FilePath -> IO Value
mkMediaObject filePath = do
bits <- B.unpack <$> B.readFile filePath
return $ ValueStruct
[ ("name", toValue fileName)
, ("type", toValue fileType)
, ("bits", ValueBase64 bits)
]
where
fileName = takeFileName filePath
fileType = case (map toLower . drop 1 . takeExtension) fileName of
"png" -> "image/png"
"jpg" -> "image/jpeg"
"jpeg" -> "image/jpeg"
"gif" -> "image/gif"
main = do
v <- uploadMediaObject "images/puppy.png"
print v