文档

MinIO Haskell SDK API 参考手册

初始化 MinIO 客户端对象。

MinIO - 用于公共 Play 服务器

minioPlayCI :: ConnectInfo
minioPlayCI

AWS S3

awsCI :: ConnectInfo
awsCI { connectAccesskey = "your-access-key"
      , connectSecretkey = "your-secret-key"
      }

桶操作

对象操作

预签名操作

listBuckets

getObject

presignedGetObjectUrl

makeBucket

putObject

presignedPutObjectUrl

removeBucket

fGetObject

presignedPostPolicy

listObjects

fPutObject

listObjectsV1

copyObject

listIncompleteUploads

removeObject

bucketExists

selectObjectContent

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

Region (Text 的别名)

默认情况下用于所有请求的连接区域。

autoDiscover

Bool

如果为 True,则启用区域发现。如果为 False,则禁用发现,所有请求仅转到给定的区域。

minioPlayCI :: ConnectInfo

此构造函数提供连接和身份验证信息,以连接到位于 https://play.min.io/ 的公共 MinIO Play 服务器。

minioCI :: Text -> Int -> Bool -> ConnectInfo

用于连接到 MinIO 服务器。

表达式 minioCI host port isSecure 中的参数为

参数

类型

描述

host

Text

MinIO 或其他与 S3 API 兼容的服务器的主机名

port

Int

要连接到的端口号

isSecure

Bool

服务器是否使用 HTTPS?

ConnectInfo 字段和默认实例

下表显示了 ConnectInfo 记录类型中的字段

字段

类型

描述

connectHost

Text

服务器的主机名。默认值为 localhost

connectPort

Int

服务器监听的端口号。默认值为 9000

connectAccessKey

Text

用于身份验证的访问密钥。默认值为 minio

connectSecretkey

Text

用于身份验证的密钥。默认值为 minio123

connectIsSecure

Bool

指定服务器是否使用 TLS。默认值为 False

connectRegion

Region (Text 的别名)

指定要使用的区域。默认值为 'us-east-1'。

connectAutoDiscoverRegion

Bool

指定库是否应自动发现存储桶的区域。默认值为 True

类型为 ConnectInfodef 值具有以上所有默认值。

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 记录类型

字段

类型

描述

biName

BucketText 的别名)

存储桶的名称

biCreationDate

UTCTime

存储桶的创建时间

makeBucket :: Bucket -> Maybe Region -> Minio ()

创建一个新的存储桶。如果未指定区域,则使用 ConnectInfo 中指定的区域。

参数

在表达式 makeBucket bucketName region 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

region

Maybe Region

创建存储桶的区域。如果未指定,则默认为 ConnectInfo 中的区域。

示例

{-# 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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

示例

{-# 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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

prefix

Maybe Text

列出对象的可选前缀

recursive

Bool

True 表示递归样式的列表,而 False 表示以 ‘/’ 分隔的目录样式列表。

返回值

返回类型

描述

C.ConduitM () ObjectInfo Minio ()

一个 Conduit 生产者,生成与每个对象相对应的 ObjectInfo 值。

ObjectInfo 记录类型

字段

类型

描述

oiObject

ObjectText 的别名)

对象的名称

oiModTime

UTCTime

对象的最后修改时间

oiETag

ETagText 的别名)

对象的 ETag

oiSize

Int64

对象的字节大小

oiMetadata

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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

prefix

Maybe Text

列出对象的可选前缀

recursive

Bool

True 表示递归样式的列表,而 False 表示以 ‘/’ 分隔的目录样式列表。

返回值

返回类型

描述

C.ConduitM () ObjectInfo Minio ()

一个 Conduit 生产者,生成与每个对象相对应的 ObjectInfo 值。

ObjectInfo 记录类型

字段

类型

描述

oiObject

ObjectText 的别名)

对象的名称

oiModTime

UTCTime

对象的最后修改时间

oiETag

ETagText 的别名)

对象的 ETag

oiSize

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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

prefix

Maybe Text

列出对象的可选前缀。

recursive

Bool

True 表示递归样式的列表,而 Talse 表示以 ‘/’ 分隔的目录样式列表。

返回值

返回类型

描述

C.ConduitM () UploadInfo Minio ()

一个 Conduit 生产者,生成与每个未完成的多部分上传相对应的 UploadInfo

UploadInfo 记录类型

字段

类型

描述

uiKey

Object

未完成上传对象的名称

uiUploadId

String

未完成上传对象的上传 ID

uiSize

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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

opts

GetObjectOptions

GET 请求的选项,指定其他选项,如 If-Match、Range

GetObjectOptions 记录类型

字段

类型

描述

gooRange

Maybe ByteRanges

表示对象的字节范围。例如 ByteRangeFromTo 0 9 表示对象的第一个十个字节

gooIfMatch

Maybe ETagText 的别名)

(可选)对象的 ETag 应匹配

gooIfNoneMatch

Maybe ETagText 的别名)

(可选)对象的 ETag 不应匹配

gooIfUnmodifiedSince

Maybe UTCTime

(可选)对象自上次修改以来的时间

gooIfModifiedSince

Maybe UTCTime

(可选)对象自上次修改以来的时间

返回值

返回值可以被增量读取以处理对象的内容。

返回类型

描述

Minio (C.ConduitM () ByteString Minio ())

一个 Conduit 源,生成 ByteString 值。

示例

{-# 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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

inputSrc

C.ConduitM () ByteString Minio ()

一个 Conduit 生产者,生成 ByteString

size

Int64

提供流大小(可选)

opts

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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

inputFile

FilePath

要上传的文件的路径

opts

GetObjectOptions

GET 请求的选项,指定其他选项,如 If-Match、Range

GetObjectOptions 记录类型

字段

类型

描述

gooRange

Maybe ByteRanges

表示对象的字节范围。例如 ByteRangeFromTo 0 9 表示对象的第一个十个字节

gooIfMatch

Maybe ETagText 的别名)

(可选)对象的 ETag 应匹配

gooIfNoneMatch

Maybe ETagText 的别名)

(可选)对象的 ETag 不应匹配

gooIfUnmodifiedSince

Maybe UTCTime

(可选)对象自上次修改以来的时间

gooIfModifiedSince

Maybe UTCTime

(可选)对象自上次修改以来的时间

{-# 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 中,参数为

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

inputFile

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 中,参数为

参数

类型

描述

dstInfo

DestinationInfo

表示目标对象属性的值

srcInfo

SourceInfo

表示源对象属性的值

SourceInfo 记录类型

字段

类型

描述

srcBucket

存储桶

源存储桶的名称

srcObject

Object

源对象的名称

srcRange

Maybe (Int64, Int64)

(可选) 表示源对象的字节范围。 (0, 9) 表示源对象的前十个字节

srcIfMatch

Maybe Text

(可选) 源对象应匹配的 ETag

srcIfNoneMatch

Maybe Text

(可选) 源对象不应匹配的 ETag

srcIfUnmodifiedSince

Maybe UTCTime

(可选) 源对象未修改以来的时间

srcIfModifiedSince

Maybe UTCTime

(可选) 源对象修改以来的时间

目标记录类型

字段

类型

描述

dstBucket

存储桶

服务器端 copyObject 中目标存储桶的名称

dstObject

Object

服务器端 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 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

示例

{-# 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 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

示例

{-# 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 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

selReq

SelectRequest

选择请求参数

SelectRequest 记录

此记录是使用 selectRequest 创建的。有关更多信息,请参阅 Haddocks。

返回值

返回值可用于读取响应中的单个 EventMessage。有关更多信息,请参阅 Haddocks。

返回类型

描述

Minio (C.conduitT () EventMessage Minio ())

EventMessage 值的 Conduit 源。

示例

{-# 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 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

4. 预签名操作

presignedGetObjectUrl :: Bucket -> Object -> UrlExpiry -> Query -> RequestHeaders -> Minio ByteString

生成一个带有身份验证签名的 URL,用于 GET(下载)对象。这里传递的所有额外的查询参数和标头都将被签名,并且在使用生成的 URL 时是必需的。查询参数可用于更改服务器发送的响应标头。标头可用于设置 Etag 匹配条件等。

有关可能的请求参数和标头的列表,请参阅 GET 对象 REST API AWS S3 文档。

参数

在表达式 presignedGetObjectUrl bucketName objectName expiry queryParams headers 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

expiry

UrlExpiryInt 的别名)

URL 过期时间(以秒为单位)

queryParams

Query(来自包 http-types:Network.HTTP.Types

要添加到 URL 的查询参数

headers

RequestHeaders(来自包 http-types:Network.HTTP.Types

将与 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 中,参数是

参数

类型

描述

bucketName

BucketText 的别名)

存储桶的名称

objectName

ObjectText 的别名)

对象的名称

expiry

UrlExpiryInt 的别名)

URL 过期时间(以秒为单位)

headers

RequestHeaders(来自包 http-types:Network.HTTP.Types

将与 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 中,参数是

参数

类型

描述

expirationTime

UTCTime(来自包 time:Data.Time.UTCTime

策略的过期时间

conditions

[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