MinIO Haskell SDK API 参考手册
初始化 MinIO 客户端对象。
MinIO - 用于公共 Play 服务器
minioPlayCI :: ConnectInfo
minioPlayCI
AWS S3
awsCI :: ConnectInfo
awsCI { connectAccesskey = "your-access-key"
, connectSecretkey = "your-secret-key"
}
桶操作 |
对象操作 |
预签名操作 |
---|---|---|
1. 连接到存储服务并运行操作
Haskell MinIO SDK 提供高级功能,用于在 MinIO 服务器或任何与 AWS S3 API 兼容的存储服务上执行操作。
ConnectInfo 类型
ConnectInfo 记录类型包含特定服务器的连接信息。建议使用库提供的几个智能构造函数之一来构造 ConnectInfo 值,这些构造函数在以下小节中进行了说明。
库默认情况下会自动发现桶的区域。这在使用 AWS 时特别有用,因为桶可能位于不同的区域。在执行上传、下载或其他操作时,库会向服务请求桶的位置并将其缓存以供后续请求使用。
awsCI :: ConnectInfo
awsCI 是一个提供连接信息以连接到 AWS S3 的值。可以通过覆盖几个字段来提供凭据,如下所示
awsConn = awsCI {
connectAccessKey = "my-AWS-access-key"
, connectSecretKey = "my-AWS-secret-key"
}
awsWithRegionCI :: Region -> Bool -> ConnectInfo
此构造函数允许指定初始区域和一个布尔值来启用/禁用自动区域发现行为。
表达式 awsWithRegion region autoDiscover 中的参数为
参数 |
类型 |
描述 |
---|---|---|
|
Region (Text 的别名) |
默认情况下用于所有请求的连接区域。 |
|
Bool |
如果为 True,则启用区域发现。如果为 False,则禁用发现,所有请求仅转到给定的区域。 |
minioPlayCI :: ConnectInfo
此构造函数提供连接和身份验证信息,以连接到位于 https://play.min.io/ 的公共 MinIO Play 服务器。
minioCI :: Text -> Int -> Bool -> ConnectInfo
用于连接到 MinIO 服务器。
表达式 minioCI host port isSecure 中的参数为
参数 |
类型 |
描述 |
---|---|---|
|
Text |
MinIO 或其他与 S3 API 兼容的服务器的主机名 |
|
Int |
要连接到的端口号 |
|
Bool |
服务器是否使用 HTTPS? |
ConnectInfo 字段和默认实例
下表显示了 ConnectInfo
记录类型中的字段
字段 |
类型 |
描述 |
---|---|---|
|
Text |
服务器的主机名。默认值为 |
|
Int |
服务器监听的端口号。默认值为 |
|
Text |
用于身份验证的访问密钥。默认值为 |
|
Text |
用于身份验证的密钥。默认值为 |
|
Bool |
指定服务器是否使用 TLS。默认值为 |
|
Region (Text 的别名) |
指定要使用的区域。默认值为 'us-east-1'。 |
|
Bool |
指定库是否应自动发现存储桶的区域。默认值为 |
类型为 ConnectInfo
的 def
值具有以上所有默认值。
Minio Monad
此 monad 提供了对 MinIO 或其他与 S3 API 兼容的服务器执行请求所需的运行时环境。它使用从提供的 ConnectInfo
值中获取的连接信息。它执行连接池、存储桶位置缓存、错误处理和资源清理操作。
该函数在 Minio
monad 中执行提供的操作,并返回一个 IO (Either MinioErr a)
值
{-# Language OverloadedStrings #-}
import Network.Minio
main :: IO ()
main = do
result <- runMinio def $ do
buckets <- listBuckets
return $ length buckets
case result of
Left e -> putStrLn $ "Failed operation with error: " ++ show e
Right n -> putStrLn $ show n ++ " bucket(s) found."
以上代码执行 listBuckets
操作并返回服务器中的存储桶数量。如果出现任何错误,它们将以 MinioErr
类型的值作为 Left
值返回。
2. 存储桶操作
listBuckets :: Minio [BucketInfo]
列出存储桶。
返回值
返回类型 |
描述 |
---|---|
Minio [BucketInfo] |
存储桶列表 |
BucketInfo 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
UTCTime |
存储桶的创建时间 |
makeBucket :: Bucket -> Maybe Region -> Minio ()
创建一个新的存储桶。如果未指定区域,则使用 ConnectInfo
中指定的区域。
参数
在表达式 makeBucket bucketName region
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Maybe Region |
创建存储桶的区域。如果未指定,则默认为 |
示例
{-# Language OverloadedStrings #-}
main :: IO ()
main = do
res <- runMinio minioPlayCI $ do
makeBucket bucketName (Just "us-east-1")
case res of
Left err -> putStrLn $ "Failed to make bucket: " ++ (show res)
Right _ -> putStrLn $ "makeBucket successful."
removeBucket :: Bucket -> Minio ()
删除存储桶。存储桶必须为空,否则将抛出错误。
参数
在表达式 removeBucket bucketName
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
示例
{-# Language OverloadedStrings #-}
main :: IO ()
main = do
res <- runMinio minioPlayCI $ do
removeBucket "mybucket"
case res of
Left err -> putStrLn $ "Failed to remove bucket: " ++ (show res)
Right _ -> putStrLn $ "removeBucket successful."
listObjects :: Bucket -> Maybe Text -> Bool -> C.ConduitM () ObjectInfo Minio ()
列出给定存储桶中的对象,实现 AWS S3 API 的版本 2。
参数
在表达式 listObjects bucketName prefix recursive
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Maybe Text |
列出对象的可选前缀 |
|
Bool |
|
返回值
返回类型 |
描述 |
---|---|
C.ConduitM () ObjectInfo Minio () |
一个 Conduit 生产者,生成与每个对象相对应的 |
ObjectInfo 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
Object( |
对象的名称 |
|
UTCTime |
对象的最后修改时间 |
|
ETag( |
对象的 ETag |
|
Int64 |
对象的字节大小 |
|
HashMap Text Text |
键值用户元数据的映射 |
示例
{-# LANGUAGE OverloadedStrings #-}
import Network.Minio
import Conduit
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "test"
-- Performs a recursive listing of all objects under bucket "test"
-- on play.min.io.
res <- runMinio minioPlayCI $
runConduit $ listObjects bucket Nothing True .| mapM_C (\v -> (liftIO $ print v))
print res
listObjectsV1 :: Bucket -> Maybe Text -> Bool -> C.ConduitM () ObjectInfo Minio ()
列出给定存储桶中的对象,实现 AWS S3 API 的版本 1。此 API 是为遗留的与 S3 兼容的对象存储端点提供的。
参数
在表达式 listObjectsV1 bucketName prefix recursive
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Maybe Text |
列出对象的可选前缀 |
|
Bool |
|
返回值
返回类型 |
描述 |
---|---|
C.ConduitM () ObjectInfo Minio () |
一个 Conduit 生产者,生成与每个对象相对应的 |
ObjectInfo 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
Object( |
对象的名称 |
|
UTCTime |
对象的最后修改时间 |
|
ETag( |
对象的 ETag |
|
Int64 |
对象的字节大小 |
示例
{-# LANGUAGE OverloadedStrings #-}
import Network.Minio
import Conduit
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "test"
-- Performs a recursive listing of all objects under bucket "test"
-- on play.min.io.
res <- runMinio minioPlayCI $
runConduit $ listObjectsV1 bucket Nothing True .| mapM_C (\v -> (liftIO $ print v))
print res
listIncompleteUploads :: Bucket -> Maybe Prefix -> Bool -> C.Producer Minio UploadInfo
列出未完成上传的对象。
参数
在表达式 listIncompleteUploads bucketName prefix recursive
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Maybe Text |
列出对象的可选前缀。 |
|
Bool |
|
返回值
返回类型 |
描述 |
---|---|
C.ConduitM () UploadInfo Minio () |
一个 Conduit 生产者,生成与每个未完成的多部分上传相对应的 |
UploadInfo 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
Object |
未完成上传对象的名称 |
|
String |
未完成上传对象的上传 ID |
|
Int64 |
未完成上传对象的字节大小 |
示例
{-# LANGUAGE OverloadedStrings #-}
import Network.Minio
import Conduit
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "test"
-- Performs a recursive listing of incomplete uploads under bucket "test"
-- on a local MinIO server.
res <- runMinio minioPlayCI $
runConduit $ listIncompleteUploads bucket Nothing True .| mapM_C (\v -> (liftIO $ print v))
print res
3. 对象操作
getObject :: Bucket -> Object -> GetObjectOptions -> Minio (C.ConduitM () ByteString Minio ())
从 S3 服务中获取对象,也可以选择性地提供对象范围。
参数
在表达式 getObject bucketName objectName opts
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
GetObjectOptions |
GET 请求的选项,指定其他选项,如 If-Match、Range |
GetObjectOptions 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
|
表示对象的字节范围。例如 ByteRangeFromTo 0 9 表示对象的第一个十个字节 |
|
|
(可选)对象的 ETag 应匹配 |
|
|
(可选)对象的 ETag 不应匹配 |
|
|
(可选)对象自上次修改以来的时间 |
|
|
(可选)对象自上次修改以来的时间 |
返回值
返回值可以被增量读取以处理对象的内容。
返回类型 |
描述 |
---|---|
Minio (C.ConduitM () ByteString Minio ()) |
一个 Conduit 源,生成 |
示例
{-# LANGUAGE OverloadedStrings #-}
import Network.Minio
import qualified Data.Conduit as C
import qualified Data.Conduit.Binary as CB
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "my-bucket"
object = "my-object"
res <- runMinio minioPlayCI $ do
src <- getObject bucket object def
C.connect src $ CB.sinkFileCautious "/tmp/my-object"
case res of
Left e -> putStrLn $ "getObject failed." ++ (show e)
Right _ -> putStrLn "getObject succeeded."
putObject :: Bucket -> Object -> C.ConduitM () ByteString Minio () -> Maybe Int64 -> PutObjectOptions -> Minio ()
将对象上传到服务中的存储桶,来自给定的输入字节流,该流可以选择性地提供长度。还可以选择性地为对象指定其他元数据。
参数
在表达式 putObject bucketName objectName inputSrc
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
C.ConduitM () ByteString Minio () |
一个 Conduit 生产者,生成 |
|
Int64 |
提供流大小(可选) |
|
PutObjectOptions |
可选参数,用于为对象提供其他元数据 |
示例
{-# LANGUAGE OverloadedStrings #-}
import Network.Minio
import qualified Data.Conduit.Combinators as CC
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "test"
object = "obj"
localFile = "/etc/lsb-release"
kb15 = 15 * 1024
-- Eg 1. Upload a stream of repeating "a" using putObject with default options.
res <- runMinio minioPlayCI $
putObject bucket object (CC.repeat "a") (Just kb15) def
case res of
Left e -> putStrLn $ "putObject failed." ++ show e
Right () -> putStrLn "putObject succeeded."
fGetObject :: Bucket -> Object -> FilePath -> GetObjectOptions -> Minio ()
从服务中的存储桶下载对象到给定文件
参数
在表达式 fGetObject bucketName objectName inputFile
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
FilePath |
要上传的文件的路径 |
|
GetObjectOptions |
GET 请求的选项,指定其他选项,如 If-Match、Range |
GetObjectOptions 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
|
表示对象的字节范围。例如 ByteRangeFromTo 0 9 表示对象的第一个十个字节 |
|
|
(可选)对象的 ETag 应匹配 |
|
|
(可选)对象的 ETag 不应匹配 |
|
|
(可选)对象自上次修改以来的时间 |
|
|
(可选)对象自上次修改以来的时间 |
{-# Language OverloadedStrings #-}
import Network.Minio
import Data.Conduit (($$+-))
import Data.Conduit.Binary (sinkLbs)
import Prelude
-- | The following example uses MinIO play server at
-- https://play.min.io. The endpoint and associated
-- credentials are provided via the libary constant,
--
-- > minioPlayCI :: ConnectInfo
--
main :: IO ()
main = do
let
bucket = "my-bucket"
object = "my-object"
localFile = "/etc/lsb-release"
res <- runMinio minioPlayCI $ do
src <- fGetObject bucket object localFile def
(src $$+- sinkLbs)
case res of
Left e -> putStrLn $ "fGetObject failed." ++ (show e)
Right _ -> putStrLn "fGetObject succeeded."
fPutObject :: Bucket -> Object -> FilePath -> Minio ()
将对象上传到服务中的存储桶,来自给定文件
参数
在表达式 fPutObject bucketName objectName inputFile
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
FilePath |
要上传的文件的路径 |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
import qualified Data.Conduit.Combinators as CC
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
localFile = "/etc/lsb-release"
res <- runMinio minioPlayCI $ do
fPutObject bucket object localFile
case res of
Left e -> putStrLn $ "Failed to fPutObject " ++ show bucket ++ "/" ++ show object
Right _ -> putStrLn "fPutObject was successful"
copyObject :: DestinationInfo -> SourceInfo -> Minio ()
将服务中一个对象的内容复制到另一个对象
参数
在表达式 copyObject dstInfo srcInfo
中,参数为
参数 |
类型 |
描述 |
---|---|---|
|
DestinationInfo |
表示目标对象属性的值 |
|
SourceInfo |
表示源对象属性的值 |
SourceInfo 记录类型
字段 |
类型 |
描述 |
---|---|---|
|
|
源存储桶的名称 |
|
|
源对象的名称 |
|
|
(可选) 表示源对象的字节范围。 (0, 9) 表示源对象的前十个字节 |
|
|
(可选) 源对象应匹配的 ETag |
|
|
(可选) 源对象不应匹配的 ETag |
|
|
(可选) 源对象未修改以来的时间 |
|
|
(可选) 源对象修改以来的时间 |
目标记录类型
字段 |
类型 |
描述 |
---|---|---|
|
|
服务器端 copyObject 中目标存储桶的名称 |
|
|
服务器端 copyObject 中目标对象的名称 |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
objectCopy = "obj-copy"
res <- runMinio minioPlayCI $ do
copyObject def { dstBucket = bucket, dstObject = objectCopy } def { srcBucket = bucket, srcObject = object }
case res of
Left e -> putStrLn $ "Failed to copyObject " ++ show bucket ++ show "/" ++ show object
Right _ -> putStrLn "copyObject was successful"
removeObject :: Bucket -> Object -> Minio ()
从服务中删除一个对象
参数
在表达式 removeObject bucketName objectName
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
res <- runMinio minioPlayCI $ do
removeObject bucket object
case res of
Left e -> putStrLn $ "Failed to remove " ++ show bucket ++ "/" ++ show object
Right _ -> putStrLn "Removed object successfully"
removeIncompleteUpload :: Bucket -> Object -> Minio ()
从服务中删除正在进行的对象多部分上传
参数
在表达式 removeIncompleteUpload bucketName objectName
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
res <- runMinio minioPlayCI $
removeIncompleteUpload bucket object
case res of
Left _ -> putStrLn $ "Failed to remove " ++ show bucket ++ "/" ++ show object
Right _ -> putStrLn "Removed incomplete upload successfully"
selectObjectContent :: Bucket -> Object -> SelectRequest -> Minio (ConduitT () EventMessage Minio ())
从服务中删除正在进行的对象多部分上传
参数
在表达式 selectObjectContent bucketName objectName selReq
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
SelectRequest |
选择请求参数 |
SelectRequest 记录
此记录是使用 selectRequest
创建的。有关更多信息,请参阅 Haddocks。
返回值
返回值可用于读取响应中的单个 EventMessage
。有关更多信息,请参阅 Haddocks。
返回类型 |
描述 |
---|---|
Minio (C.conduitT () EventMessage Minio ()) |
|
示例
{-# Language OverloadedStrings #-}
import Network.Minio
import qualified Conduit as C
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
res <- runMinio minioPlayCI $ do
let sr = selectRequest "Select * from s3object"
defaultCsvInput defaultCsvOutput
res <- selectObjectContent bucket object sr
C.runConduit $ res C..| getPayloadBytes C..| C.stdoutC
case res of
Left _ -> putStrLn "Failed!"
Right _ -> putStrLn "Success!"
bucketExists :: Bucket -> Minio Bool
检查存储桶是否存在。
参数
在表达式 bucketExists bucketName
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
4. 预签名操作
presignedGetObjectUrl :: Bucket -> Object -> UrlExpiry -> Query -> RequestHeaders -> Minio ByteString
生成一个带有身份验证签名的 URL,用于 GET(下载)对象。这里传递的所有额外的查询参数和标头都将被签名,并且在使用生成的 URL 时是必需的。查询参数可用于更改服务器发送的响应标头。标头可用于设置 Etag 匹配条件等。
有关可能的请求参数和标头的列表,请参阅 GET 对象 REST API AWS S3 文档。
参数
在表达式 presignedGetObjectUrl bucketName objectName expiry queryParams headers
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
UrlExpiry( |
URL 过期时间(以秒为单位) |
|
Query(来自包 |
要添加到 URL 的查询参数 |
|
RequestHeaders(来自包 |
将与 URL 一起使用的请求标头 |
返回值
返回生成的 URL - 它将包含身份验证信息。
返回类型 |
描述 |
---|---|
ByteString |
生成的预签名 URL |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
import qualified Data.ByteString.Char8 as B
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
res <- runMinio minioPlayCI $ do
-- Set a 7 day expiry for the URL
presignedGetObjectUrl bucket object (7*24*3600) [] []
-- Print the URL on success.
putStrLn $ either
(("Failed to generate URL: " ++) . show)
B.unpack
res
presignedPutObjectUrl :: Bucket -> Object -> UrlExpiry -> RequestHeaders -> Minio ByteString
生成一个带有身份验证签名的 URL,用于 PUT(上传)对象。如果传递了任何额外的标头,则会对其进行签名,因此在使用 URL 上传数据时是必需的。这可用于在对象上设置用户元数据等。
有关要传递的可能标头的列表,请参阅 PUT 对象 REST API AWS S3 文档。
参数
在表达式 presignedPutObjectUrl bucketName objectName expiry headers
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
Bucket( |
存储桶的名称 |
|
Object( |
对象的名称 |
|
UrlExpiry( |
URL 过期时间(以秒为单位) |
|
RequestHeaders(来自包 |
将与 URL 一起使用的请求标头 |
返回值
返回生成的 URL - 它将包含身份验证信息。
返回类型 |
描述 |
---|---|
ByteString |
生成的预签名 URL |
示例
{-# Language OverloadedStrings #-}
import Network.Minio
import qualified Data.ByteString.Char8 as B
main :: IO ()
main = do
let
bucket = "mybucket"
object = "myobject"
res <- runMinio minioPlayCI $ do
-- Set a 7 day expiry for the URL
presignedPutObjectUrl bucket object (7*24*3600) [] []
-- Print the URL on success.
putStrLn $ either
(("Failed to generate URL: " ++) . show)
B.unpack
res
presignedPostPolicy :: PostPolicy -> Minio (ByteString, HashMap Text ByteString)
生成一个预签名的 URL 和 POST 策略,用于通过 POST 请求上传文件。这是为浏览器上传设计的,它会生成应该在请求中提交的表单数据。
PostPolicy
参数是使用 newPostPolicy
函数创建的
newPostPolicy :: UTCTime -> [PostPolicyCondition] -> Either PostPolicyError PostPolicy
在表达式 newPostPolicy expirationTime conditions
中,参数是
参数 |
类型 |
描述 |
---|---|---|
|
UTCTime(来自包 |
策略的过期时间 |
|
[PostPolicyConditions] |
要添加到策略的条件列表 |
策略条件是使用各种辅助函数创建的 - 有关详细信息,请参阅 Haddocks。
由于条件由 newPostPolicy
验证,因此它会返回一个 Either
值。
返回值
presignedPostPolicy
返回一个 2 元组 - 生成的 URL 和一个包含应与请求一起提交的表单数据的映射。
示例
{-# Language OverloadedStrings #-}
import Network.Minio
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as Char8
import qualified Data.HashMap.Strict as H
import qualified Data.Text.Encoding as Enc
import qualified Data.Time as Time
main :: IO ()
main = do
now <- Time.getCurrentTime
let
bucket = "mybucket"
object = "myobject"
-- set an expiration time of 10 days
expireTime = Time.addUTCTime (3600 * 24 * 10) now
-- create a policy with expiration time and conditions - since the
-- conditions are validated, newPostPolicy returns an Either value
policyE = newPostPolicy expireTime
[ -- set the object name condition
ppCondKey "photos/my-object"
-- set the bucket name condition
, ppCondBucket "my-bucket"
-- set the size range of object as 1B to 10MiB
, ppCondContentLengthRange 1 (10*1024*1024)
-- set content type as jpg image
, ppCondContentType "image/jpeg"
-- on success set the server response code to 200
, ppCondSuccessActionStatus 200
]
case policyE of
Left err -> putStrLn $ show err
Right policy -> do
res <- runMinio minioPlayCI $ do
(url, formData) <- presignedPostPolicy policy
-- a curl command is output to demonstrate using the generated
-- URL and form-data
let
formFn (k, v) = B.concat ["-F ", Enc.encodeUtf8 k, "=",
"'", v, "'"]
formOptions = B.intercalate " " $ map formFn $ H.toList formData
return $ B.intercalate " " $
["curl", formOptions, "-F file=@/tmp/photo.jpg", url]
case res of
Left e -> putStrLn $ "post-policy error: " ++ (show e)
Right cmd -> do
putStrLn $ "Put a photo at /tmp/photo.jpg and run command:\n"
-- print the generated curl command
Char8.putStrLn cmd