{-# LANGUAGE OverloadedStrings #-} {- This example demonstrates an ability to stream in constant space content from a remote resource into an S3 object accessible publicly -} import qualified Aws import Aws.Aws (Configuration (..)) import qualified Aws.S3 as S3 import Control.Applicative ((<$>)) import Control.Monad.Trans.Resource import qualified Data.Text as T import Network.HTTP.Conduit (http, parseUrl, responseBody, newManager, tlsManagerSettings) import System.Environment (getArgs) main :: IO () main = do maybeCreds <- Aws.loadCredentialsFromEnv case maybeCreds of Nothing -> do putStrLn "Please set the environment variables AWS_ACCESS_KEY_ID and AWS_ACCESS_KEY_SECRET" Just creds -> do args <- getArgs cfg <- Aws.dbgConfiguration let s3cfg = Aws.defServiceConfig :: S3.S3Configuration Aws.NormalQuery case args of [sourceUrl,destBucket,destObj] -> do request <- parseUrl sourceUrl mgr <- newManager tlsManagerSettings runResourceT $ do source <- responseBody <$> http request mgr let initiator b o = (S3.postInitiateMultipartUpload b o){S3.imuAcl = Just S3.AclPublicRead} S3.multipartUploadWithInitiator cfg{credentials = creds} s3cfg initiator mgr (T.pack destBucket) (T.pack destObj) source (10*1024*1024) _ -> do putStrLn "Usage: MultipartTransfer sourceUrl destinationBucket destinationObjectname"