通过管道流式传输整个文件

时间:2020-05-21 16:04:47

标签: file haskell streaming conduit

我正在努力通过Servant下载(动态)文件。

说我具有使用该库从S3中提取文件的以下功能:https://hackage.haskell.org/package/aws

color

然后我这样称呼它:

getS3Object
  :: MonadIO m
  => MonadReader Config m
  => MonadError CustomError m
  => Text
  -> m (Maybe ByteString)

getS3Object fileName = do
    config <- ask
    configObject <- constructS3Authentication
    mgr <- liftIO $ newManager tlsManagerSettings
    liftIO $ runResourceT $
      Aws.pureAws (awsConfig configObject) (s3Config configObject) mgr (S3.getObject (config ^. awsCustomerDocumentsBucket) fileName) >>= 
        \gor -> runConduit (responseBody (S3.gorResponse gor) .| await)

当我调用此功能(通过Postman调用必需的路由)时,Potato.pdf是一个4kb的文件,似乎它可能是我的PDF文件的一部分,但不是全部。该文件无法打开。

奇怪的是,当我将fetchDocument :: MonadIO m => MonadCatch m => MonadReader Config m => MonadError CustomError m => NewDocumentInput -> m ByteString fetchDocument inputDocument = do let fileName = computeFileName inputDocument documentObject <- getS3Object fileName case documentObject of Nothing -> throwError $ OtherAWSError "No document returned, or other uncaught exception" Just document -> liftIO $ do writeFile "./tmp/potato.pdf" document return document 的最后一行更改为:

getS3Object

输出到磁盘的文件是完全正确(33KB)的PDF文件(可以打开c)。

我的问题是,我在哪里丢失文件的其余部分?我是否以某种方式错误地使用了导管?以及如何解决此问题。

0 个答案:

没有答案