NCMB Kotlin SDKは先日リリースされ、現在も活発に開発を行っています。NCMBの1機能であるファイルストア(写真やテキストファイルを扱うストレージ)にファイルをアップロードする際に悩む可能性がありそうなので備忘録として書いておきます。
v1.1.0におけるNCMBFileの使い方
v1.1.0におけるファイルストアへのファイルアップロードは次のようになっています。
constructor(fileName:String, fileData:File) : super("files") {
mIgnoreKeys = this.ignoreKeys
this.fileName = fileName
this.fileData = fileData
}
fileDataとして渡すのはFileオブジェクトになります。写真ピッカーを使って取得されるのはUriクラスですが、そのままでは使えないので注意してください。
解決策
解決策は2つあります。
- 実際のファイルオブジェクトを取得する
- テンポラリファイルに書き出す
実際のファイルオブジェクトを取得する
Uriから本当のFileを取得する方法はあるのですが、そのためにはファイルストレージへのアクセス権限が必要になります。これはちょっと面倒そうです。
テンポラリファイルに書き出す
テンポラリファイルに書き出す方法であれば、さほど難しくありません。
// 出力先(テンポラリ)
val outputDir = context.cacheDir
val outputFile = File.createTempFile(fileName, ".${extension}", outputDir)
// bitmapをByteArrayに変換する
val stream = ByteArrayOutputStream()
if (extension == "jpg" || extension == "jpeg") {
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream)
} else if (extension == "png") {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
}
// テンポラリファイルに出力
outputFile.writeBytes(stream.toByteArray())
アップロードする
後はこのFileを使ってファイルストアへのアップロード処理を行います。
val file = NCMBFile(fileName = fileName, fileData = outputFile)
file.save()
削除する
アップロード処理が終わったら、テンポラリファイルは削除します。
Files.deleteIfExists(tempFile.toPath())
まとめ
ファイルストアを使えば、たった1行のコードでファイルをクラウドストレージにアップロードできます。Kotlin SDKはまだ開発が活発なので、さらに便利な機能が追加されていきます。ぜひあなたのKotlinアプリ開発で役立ててください。