様々な言語からMinioのファイルアップロードを試す
様々な言語からMinioを試してみる。
※といっても、現在は3言語しかまだ書いていない
最近 Go言語で書かれた、S3互換のオブジェクトストレージサーバを触り始めたので、
各言語での試し方をこちらにメモしておく。
なお、あくまで現時点でのやり方となるので、もしこの記事が古くなっているようだったら、
公式からDocsに飛んで確認するのが望ましい。
まずはNode.jsから
Node.js
セットアップ
npm install minio
実装
const Minio = require('minio'); const fs = require('fs'); const path = require('path'); const location = 'us-east-1'; const minioClient = new Minio.Client({ endPoint: END_POINT, port: PORT, secure: false, // テストなのでひとまずfalseにしている accessKey: ACCESS_KEY, secretKey: SECRET_KEY }); // Bucket作成 function createBucket(bucketName) { minioClient.makeBucket(bucketName, location, function(err) { if(err) return console.log(err); console.log('Bucket created successfully in ', location); console.log('Created bucket name => ', bucketName); }); } // imagesディレクトリ内の画像ファイルを作成したBucketに全てアップロードする function fileUpload(bucketName, uploadDir) { let files = fs.readdirSync(uploadDir); files.forEach(function(file) { console.log('Upload file =>', file); // アップロードするファイル名 let filePath = path.join(uploadDir, file); // fPutObjectを使用してファイルをBucket "SampleImages"にアップロードします minioClient.fPutObject(bucketName, file, filePath, 'image/png', function(err, etag) { if(err) return console.log(err); console.log('File upload successfully!!'); console.log('Uploaded File Name => ', file); }); }); } // 作成するBucket名 const bucketName = 'nodetest'; // アップロード対象が格納されたディレクトリ名 let targetDir = 'images'; // アップロード対象の絶対パス let uploadDir = path.join(__dirname, targetDir); // 実行 createBucket(bucketName); fileUpload(bucketName, uploadDir);
Python
セットアップ
pip install minio
実装
from minio import Minio from minio.error import ResponseError import os import glob # テストなのでひとまずsecureはFalseにしている minioClient = Minio(END_POINT, access_key=ACCESS_KEY, secret_key=SECRET_KEY, secure=False) # Bucketを作成する def create_bucket(bucket_name): try: minioClient.make_bucket(bucket_name, location='us-east-1') except ResponseError as err: print(err) # 対象ディレクトリなのファイルを取得し、アップロードする def file_upload(bucket_name, upload_dir): for i in glob.glob(os.path.join(upload_dir, '*.png')): try: minioClient.fput_object(bucket_name, os.path.basename(i), i) except ResponseError as err: print(err) # 作成するBucket名 bucket_name = 'pythontest' # アップロード対象のファイルが格納されたディレクトリ名 target_dir = 'images' # アップロード対象の絶対パス upload_dir = os.path.join(os.getcwd(), target_dir) print('File upload start'); create_bucket(bucket_name) file_upload(bucket_name, upload_dir) print('File upload successfully!')
Go
セットアップ
go get -u github.com/minio/minio-go
実装
package main import ( "fmt" "github.com/minio/minio-go" // Import Minio library. "io/ioutil" "log" "os" "path/filepath" ) func main() { bname := "gotest" tdir := "images" tpath, err := os.Getwd() ssl := false // テストなのでひとまずfalseとしている location := "us-east-1" minioClient, err := minio.New(Endpoint, AccessKey, SecretKey, ssl) if err != nil { log.Fatalln(err) } // bucketを作成 err = minioClient.MakeBucket(bname, location) if err != nil { // 既に同名のbucketが存在していないかを確認する exists, err := minioClient.BucketExists(bname) if err == nil && exists { fmt.Printf("We already own %s\n", bname) } else { log.Fatalln(err) } } else { fmt.Printf("Successfully created %s\n", bname) } // 指定したディレクトリからファイルを取得 filelist, err := ioutil.ReadDir(filepath.Join(tpath, tdir)) if err != nil { fmt.Println(err) return } // 取得したファイルをすべてアップロードする for index, element := range filelist { fmt.Printf("Uploading... %s : %d\n", element.Name(), index) n, err := minioClient.FPutObject(bname, element.Name(), filepath.Join(tpath, tdir, element.Name()), "image/png") if err != nil { log.Fatalln(err) } fmt.Printf("Successfully uploadefd %s of size %d\n", element.Name(), n) } }
ひとまずここまで。
汚いコードをただ書き散らしているような気もする。。。精進していかねば。
あと、昨日からElixir触り始めたので、Elixirのサンプルも近々書きたい。
ちょっと試すだけでも使用コストがかかってしまうAmazon S3の代替手段として
Minioの存在価値はとてもあると思う。気軽にローカルでの開発などに使えるので、とても便利。
インストール関連の記事は検索してみると色々出て来るし、公式のスタートガイドも分かりやすい。
いいですね、Minio