我正在尝试使用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