使用Conduits将文件提供给HTTP请求

时间:2014-01-16 17:46:44

标签: haskell amazon-web-services amazon-s3 yesod

我在尝试构建RequestBody ResourceT IO时遇到了麻烦。 我是管道员的新手,我正在尝试使用aws包将文件上传到S3。

io $ withManager $ \mgr ->
      do Aws.pureAws cfg s3cfg mgr $ S3.putObject stcompleted "job.zip" $ 
            RequestBodySourceChunked $ do
                  CB.sourceFile "job.zip"

我收到的类型错误就是这个。

  Couldn't match type `Data.ByteString.Internal.ByteString'
                  with `Blaze.ByteString.Builder.Internal.Types.Builder'
    Expected type: Source
                     (ResourceT IO) Blaze.ByteString.Builder.Internal.Types.Builder
      Actual type: ConduitM
                     () Data.ByteString.Internal.ByteString (ResourceT IO) ()
    In the return type of a call of `CB.sourceFile'
    In a stmt of a 'do' block: CB.sourceFile "job.zip"
    In the second argument of `($)', namely
      `do { CB.sourceFile "job.zip" }'

putObject的类型是

putObject
  :: Bucket
     -> Data.Text.Internal.Text
     -> http-conduit-1.9.5.2:Network.HTTP.Conduit.Types.RequestBody
          (Control.Monad.Trans.Resource.Internal.ResourceT IO)
     -> PutObject

我无法看到如何构造RequestBody ResourceT IO,因为RequestBody的可能构造函数不包含ResoureceT IO

data RequestBody m
  = RequestBodyLBS Data.ByteString.Lazy.Internal.ByteString
  | RequestBodyBS Data.ByteString.Internal.ByteString
  | RequestBodyBuilder GHC.Int.Int64
                       Blaze.ByteString.Builder.Internal.Types.Builder
  | RequestBodySource GHC.Int.Int64
                      (Data.Conduit.Internal.Source
                         m Blaze.ByteString.Builder.Internal.Types.Builder)
  | RequestBodySourceChunked (Data.Conduit.Internal.Source
                                m Blaze.ByteString.Builder.Internal.Types.Builder)

1 个答案:

答案 0 :(得分:4)

这里的关键(清理了一下)是:

  

无法将类型ByteString与Builder匹配

所以第一个问题是:如何将ByteString转换为Builder? Using Hoogle我们获得了一些可能的点击量,fromByteString证明是最好的。

接下来的问题是如何转换Source以产生新类型的值。这需要对导管有所了解,我建议the conduit tutorial。但我们的想法是创建一个数据转换器(Conduit)来转换ByteString的传入流并产生一个Builder s的输出流,并且 fuse 使用Source

首先,我们要使用map的{​​{1}}抽象。对于第二个,融合算子是Data.Conduit.List。总而言之,我们有:

$=