Work Records

日々の作業記録です。ソフトウェアエンジニアリング全般から、趣味の話まで。

AWSiOSSDKv2 AWSS3TransferManagerで同名のファイルをS3から並列にダウンロードする時には注意!

小ネタだけど、どはまりしたのでメモっておく

ディレクトリ、同名のファイルをダウンロードすると画像が壊れている、全て同じファイルになる、という現象にぶつかる

例えば、こんな感じの構成のファイルがS3にある場合

BucketName/Dir1/image.jpeg
BucketName/Dir2/image.jpeg

これをAWSS3TransferManagerを使って、並列にダウンロードしようとして

(snip)
AWSS3TransferManagerDownloadRequest *downloadRequest = [AWSS3TransferManagerDownloadRequest new];
downloadRequest.bucket = BucketName;
downloadRequest.key = key; // keyはDir1/image.jpeg or Dir2/image.jpegでforで回す
[[transferManager download:downloadRequest] continueWithExecutor:[BFExecutor  mainThreadExecutor] withBlock:^id(BFTask *task) {
  // ごにょごにょ
});
(snip)

とすると、iPhone内のテンポラリディレクトリには、

/tmp/image.jpeg
/tmp/image.jpeg (1)

みたいに、同名のファイル + カッコのナンバリングの形になってしまう。

そこではまった

そんな処理を繰り返していると、
1. /tmpを見て、次の番号を決める
2. 画像を書き込む
3. 書き込み完了
の処理タイミングが被ってしまったファイル同士で書き込み先がコンフリクトしてしまい、ファイル自体が壊れるか、ぱっと見はちゃんとした画像だけど、同名別画像で上書きされてしまう、という状況になってしまった。

ダウンロード先のファイル名は指定してあげた方が無難

そのため、以下のプロパティを追加してあげた。

downloadRequest.downloadingFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:"被らなそうなユニークな文字列"]];

これで問題なくなる。
大量にダウンロードした時に全部同じ画像になったりしていたらその辺りを疑うともしかしたらこんなことが起きているかもしれません。


[asin:482226999X:detail]