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
中的參數為
參數 |
型別 |
描述 |
---|---|---|
|
區域( |
所有請求預設連接的區域。 |
|
布林值 |
如果為 |
minioPlayCI :: ConnectInfo
此建構函式提供連線和驗證資訊,以連線至位於 https://play.min.io/
的公開 MinIO Play 伺服器。
minioCI :: Text -> Int -> Bool -> ConnectInfo
用於連線至 MinIO 伺服器。
在運算式 minioCI host port isSecure
中的參數為
參數 |
型別 |
描述 |
---|---|---|
|
文字 |
MinIO 或其他 S3-API 相容伺服器的主機名稱 |
|
整數 |
要連接的連接埠號碼 |
|
布林值 |
伺服器是否使用 HTTPS? |
ConnectInfo 欄位和預設執行個體
下表顯示 ConnectInfo
記錄類型的欄位
欄位 |
型別 |
描述 |
---|---|---|
|
文字 |
伺服器的主機名稱。預設為 |
|
整數 |
伺服器接聽的連接埠號碼。預設為 |
|
文字 |
驗證中使用的存取金鑰。預設為 |
|
文字 |
驗證中使用的秘密金鑰。預設為 |
|
布林值 |
指定伺服器是否使用 TLS。預設為 |
|
區域( |
指定要使用的區域。預設為 'us-east-1' |
|
布林值 |
指定程式庫是否應自動探索儲存貯體的區域。預設為 |
類型為 ConnectInfo
的 def
值具有以上所有預設值。
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 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
UTCTime |
儲存貯體的建立時間 |
makeBucket :: Bucket -> Maybe Region -> Minio ()
建立新的儲存貯體。如果未指定區域,則使用 ConnectInfo
指定的區域。
參數
在運算式 makeBucket bucketName region
中,引數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
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
中,引數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
範例
{-# 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
中,引數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
Maybe Text |
選用的前置詞,列出的物件應具有該前置詞 |
|
布林值 |
|
傳回值
傳回類型 |
描述 |
---|---|
C.ConduitM () ObjectInfo Minio () |
每個物件對應的 |
ObjectInfo 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
物件( |
物件的名稱 |
|
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
中,引數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
Maybe Text |
選用的前置詞,列出的物件應具有該前置詞 |
|
布林值 |
|
傳回值
傳回類型 |
描述 |
---|---|
C.ConduitM () ObjectInfo Minio () |
每個物件對應的 |
ObjectInfo 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
物件( |
物件的名稱 |
|
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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
Maybe Text |
選用的前置詞,列出的物件應具有該前置詞。 |
|
布林值 |
|
傳回值
傳回類型 |
描述 |
---|---|
C.ConduitM () UploadInfo Minio () |
每個未完整多部分上傳對應的 |
UploadInfo 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
物件 |
未完整上傳物件的名稱 |
|
字串 |
未完整上傳物件的上傳 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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
GetObjectOptions |
GET 請求的選項,指定其他選項,例如 If-Match、Range |
GetObjectOptions 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
|
表示物件的位元組範圍。例如,ByteRangeFromTo 0 9 表示物件的前十個位元組 |
|
|
(選用) 物件的 ETag 應該符合 |
|
|
(選用) 物件的 ETag 不應符合 |
|
|
(選用) 物件未修改的時間 |
|
|
(選用) 物件修改的時間 |
傳回值
傳回值可以漸進讀取,以處理物件的內容。
傳回類型 |
描述 |
---|---|
Minio (C.ConduitM () ByteString Minio ()) |
|
範例
{-# 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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
C.ConduitM () ByteString Minio () |
|
|
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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
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 |
|
|
(選填) 來源物件未修改的時間 |
|
|
(選填) 來源物件修改的時間 |
Destination 記錄類型
欄位 |
型別 |
描述 |
---|---|---|
|
|
伺服器端 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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
範例
{-# 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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
範例
{-# 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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
SelectRequest |
Select 請求參數 |
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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
4. 預先簽署的操作
presignedGetObjectUrl :: Bucket -> Object -> UrlExpiry -> Query -> RequestHeaders -> Minio ByteString
產生一個帶有驗證簽名的 URL,以 GET (下載) 物件。這裡傳遞的所有額外查詢參數和標頭都將被簽署,並且在使用產生的 URL 時是必需的。查詢參數可用於變更伺服器傳送的回應標頭。標頭可用於設定 ETag 匹配條件等等。
如需可能的請求參數和標頭的清單,請參閱 GET 物件 REST API AWS S3 文件。
參數
在表達式 presignedGetObjectUrl bucketName objectName expiry queryParams headers
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
UrlExpiry (alias for |
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
中,參數為
參數 |
型別 |
描述 |
---|---|---|
|
儲存貯體( |
儲存貯體的名稱 |
|
物件( |
物件的名稱 |
|
UrlExpiry (alias for |
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