文件

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

區域Text 的別名)

所有請求預設連接的區域。

autoDiscover

布林值

如果為 True,則啟用區域探索。如果為 False,則停用探索,所有請求僅發送到給定的區域。

minioPlayCI :: ConnectInfo

此建構函式提供連線和驗證資訊,以連線至位於 https://play.min.io/ 的公開 MinIO Play 伺服器。

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

用於連線至 MinIO 伺服器。

在運算式 minioCI host port isSecure 中的參數為

參數

型別

描述

host

文字

MinIO 或其他 S3-API 相容伺服器的主機名稱

port

整數

要連接的連接埠號碼

isSecure

布林值

伺服器是否使用 HTTPS?

ConnectInfo 欄位和預設執行個體

下表顯示 ConnectInfo 記錄類型的欄位

欄位

型別

描述

connectHost

文字

伺服器的主機名稱。預設為 localhost

connectPort

整數

伺服器接聽的連接埠號碼。預設為 9000

connectAccessKey

文字

驗證中使用的存取金鑰。預設為 minio

connectSecretkey

文字

驗證中使用的秘密金鑰。預設為 minio123

connectIsSecure

布林值

指定伺服器是否使用 TLS。預設為 False

connectRegion

區域Text 的別名)

指定要使用的區域。預設為 'us-east-1'

connectAutoDiscoverRegion

布林值

指定程式庫是否應自動探索儲存貯體的區域。預設為 True

類型為 ConnectInfodef 值具有以上所有預設值。

Minio Monad

此 monad 提供必要的環境,以針對 MinIO 或其他 S3 API 相容伺服器執行請求。它使用從提供給它的 ConnectInfo 值取得的連線資訊。它執行連線集區、儲存貯體位置快取、錯誤處理和資源清理動作。

runMinio 函式會在 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

儲存貯體Text 的別名)

儲存貯體的名稱

biCreationDate

UTCTime

儲存貯體的建立時間

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

建立新的儲存貯體。如果未指定區域,則使用 ConnectInfo 指定的區域。

參數

在運算式 makeBucket bucketName region 中,引數為

參數

型別

描述

bucketName

儲存貯體Text 的別名)

儲存貯體的名稱

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

儲存貯體Text 的別名)

儲存貯體的名稱

範例

{-# 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

儲存貯體Text 的別名)

儲存貯體的名稱

prefix

Maybe Text

選用的前置詞,列出的物件應具有該前置詞

recursive

布林值

True 表示遞迴樣式清單,False 表示以 '/' 分隔的目錄樣式清單。

傳回值

傳回類型

描述

C.ConduitM () ObjectInfo Minio ()

每個物件對應的 ObjectInfo 值的 Conduit 生產者。

ObjectInfo 記錄類型

欄位

型別

描述

oiObject

物件Text 的別名)

物件的名稱

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

儲存貯體Text 的別名)

儲存貯體的名稱

prefix

Maybe Text

選用的前置詞,列出的物件應具有該前置詞

recursive

布林值

True 表示遞迴樣式清單,False 表示以 '/' 分隔的目錄樣式清單。

傳回值

傳回類型

描述

C.ConduitM () ObjectInfo Minio ()

每個物件對應的 ObjectInfo 值的 Conduit 生產者。

ObjectInfo 記錄類型

欄位

型別

描述

oiObject

物件Text 的別名)

物件的名稱

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

儲存貯體Text 的別名)

儲存貯體的名稱

prefix

Maybe Text

選用的前置詞,列出的物件應具有該前置詞。

recursive

布林值

True 表示遞迴樣式清單,Talse 表示以 '/' 分隔的目錄樣式清單。

傳回值

傳回類型

描述

C.ConduitM () UploadInfo Minio ()

每個未完整多部分上傳對應的 UploadInfo 值的 Conduit 生產者

UploadInfo 記錄類型

欄位

型別

描述

uiKey

物件

未完整上傳物件的名稱

uiUploadId

字串

未完整上傳物件的上傳 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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

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 ())

ByteString 值的 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 中,參數為

參數

型別

描述

bucketName

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

inputSrc

C.ConduitM () ByteString Minio ()

ByteString 值的 Conduit 生產者

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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

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

Bucket

來源儲存桶的名稱

srcObject

物件

來源物件的名稱

srcRange

Maybe (Int64, Int64)

(選填) 表示來源物件的位元組範圍。(0, 9) 表示來源物件的前十個位元組

srcIfMatch

Maybe Text

(選填) 來源物件應該匹配的 ETag

srcIfNoneMatch

Maybe Text

(選填) 來源物件不應該匹配的 ETag

srcIfUnmodifiedSince

Maybe UTCTime

(選填) 來源物件未修改的時間

srcIfModifiedSince

Maybe UTCTime

(選填) 來源物件修改的時間

Destination 記錄類型

欄位

型別

描述

dstBucket

Bucket

伺服器端 copyObject 中目標儲存桶的名稱

dstObject

物件

伺服器端 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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

範例

{-# 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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

範例

{-# 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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

selReq

SelectRequest

Select 請求參數

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

儲存貯體Text 的別名)

儲存貯體的名稱

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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

expiry

UrlExpiry (alias for Int)

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

儲存貯體Text 的別名)

儲存貯體的名稱

objectName

物件Text 的別名)

物件的名稱

expiry

UrlExpiry (alias for Int)

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