Skip to content
MinIO Client SDK for Haskell
Branch: master
Clone or download
donatello and harshavardhana Add streaming signature for PutObject (#123)
Use streaming signature to avoid reading the body twice in PutObject
requests, where the body can be upto 5GIB.

Note that the body is signed only used when the connection is not
using TLS.
Latest commit 4a807fd May 16, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs MinIO & replaces Minio & respectively (#114) Apr 12, 2019
test Accept GetObjectOptions in statObject (#112) Apr 14, 2019
.gitignore Add serviceStatus and serviceSendAction admin APIs (#100) Jun 25, 2018
.stylish-haskell.yaml Switch to unliftio and lts-11.1 (#83) Mar 26, 2018
.travis.yml Build on GHC 8.6.5 (#117) May 10, 2019 Update for new release (#122) May 13, 2019 Fix wording and links. (#1) Feb 13, 2017
LICENSE MinIO & replaces Minio & respectively (#114) Apr 12, 2019
Setup.hs MinIO & replaces Minio & respectively (#114) Apr 12, 2019
minio-hs.cabal Add streaming signature for PutObject (#123) May 17, 2019

MinIO Client SDK for Haskell Build StatusHackageSlack

The MinIO Haskell Client SDK provides simple APIs to access MinIO and Amazon S3 compatible object storage server.

Minimum Requirements


git clone

cd minio-hs/

stack install

Tests can be run with:

stack test

A section of the tests use the remote MinIO Play server at by default. For library development, using this remote server maybe slow. To run the tests against a locally running MinIO live server at http://localhost:9000, just set the environment MINIO_LOCAL to any value (and unset it to switch back to Play).

Documentation can be locally built with:

stack haddock

Quick-Start Example - File Uploader


#!/usr/bin/env stack
-- stack --resolver lts-11.1 runghc --package minio-hs --package optparse-applicative --package filepath

-- MinIO Haskell SDK, (C) 2017, 2018 MinIO, Inc.
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- See the License for the specific language governing permissions and
-- limitations under the License.

{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
import           Network.Minio

import           Data.Monoid           ((<>))
import           Data.Text             (pack)
import           Options.Applicative
import           System.FilePath.Posix
import           UnliftIO              (throwIO, try)

import           Prelude

-- | The following example uses minio's play server at
--  The endpoint and associated
-- credentials are provided via the libary constant,
-- > minioPlayCI :: ConnectInfo

-- optparse-applicative package based command-line parsing.
fileNameArgs :: Parser FilePath
fileNameArgs = strArgument
               (metavar "FILENAME"
                <> help "Name of file to upload to AWS S3 or a MinIO server")

cmdParser = info
            (helper <*> fileNameArgs)
             <> progDesc "FileUploader"
             <> header
             "FileUploader - a simple file-uploader program using minio-hs")

main :: IO ()
main = do
  let bucket = "my-bucket"

  -- Parse command line argument
  filepath <- execParser cmdParser
  let object = pack $ takeBaseName filepath

  res <- runMinio minioPlayCI $ do
    -- Make a bucket; catch bucket already exists exception if thrown.
    bErr <- try $ makeBucket bucket Nothing
    case bErr of
      Left (MErrService BucketAlreadyOwnedByYou) -> return ()
      Left e                                     -> throwIO e
      Right _                                    -> return ()

    -- Upload filepath to bucket; object is derived from filepath.
    fPutObject bucket object filepath def

  case res of
    Left e   -> putStrLn $ "file upload failed due to " ++ (show e)
    Right () -> putStrLn "file upload succeeded."

Run FileUploader

./FileUploader.hs "path/to/my/file"


Contributors Guide

You can’t perform that action at this time.