Amazon S3の署名付きURL発行の際に別名でファイルをダウンロードさせるようにする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

S3からファイルを直接ダウンロードする方法で署名付きURLを発行し、一時的に一部のファイルのみをダウンロードさせる機能があります。
今回はこのURLを発行する際に、実際のファイル名とは別名でダウンロード出来る方法を紹介します。

実装してみる

今回はAWS SDK for JAVAを使用して実装してみました。

public class GenerateUrl {

    private static String bucketName = "test-bucket";
    private static String path = "images";

    public static void main(String[] args) {
        try {
            AWSCredentials credentials = new BasicAWSCredentials(YOUR_AWS_ACCESS_KEY_ID,
                    YOUR_AWS_SECRET_ACCESS_KEY);

            String secretAccessKey = credentials.getAWSSecretKey();
            Mac mac = null;
            mac = Mac.getInstance("HmacSHA1");
            mac.init(new SecretKeySpec(secretAccessKey.getBytes(), "HmacSHA1"));

            AmazonS3 s3 = new AmazonS3Client(credentials);

            Date expiration = new Date();
            long milliSeconds = expiration.getTime();
            milliSeconds += 1000 * 60 * 60;
            expiration.setTime(milliSeconds);

            String downloadKey = path + "/image.png";

            String newFilename = URLEncoder.encode("てすと画像.png", "UTF8");

            ResponseHeaderOverrides headers = new ResponseHeaderOverrides();
            headers.withContentDisposition("attachment;filename=" + newFilename);

            GeneratePresignedUrlRequest greq = new GeneratePresignedUrlRequest(
                    bucketName, downloadKey, HttpMethod.GET);
            greq.withExpiration(expiration);
            greq.withResponseHeaders(headers);

            URL url = s3.generatePresignedUrl(greq);

            System.out.println(url.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上記実装例では、「image.png」というS3上に登録されているファイルをダウンロード時に「てすと画像.png」という別名でダウンロードさせています。
署名付きURL生成の細かいところは今回は解説しません。
ポイントとなるのは25行目から28行目でResponseHeaderOverridesクラスを使用してレスポンスヘッダの値を設定し、33行目でURL生成をする際に、有効期限と合わせて生成したレスポンスヘッダを設定している箇所になります。
このレスポンスヘッダを設定するとURLに以下のパラメータが追加されます。

response-content-disposition=attachment;filename={ファイル名}

まとめ

通常の署名付きURL発行のプログラムに設定をするだけで簡単に別名でファイルを保存させることができました。
セキュリティの観点からS3上にはランダム文字列でファイルを保存している場合や同一ファイル名で保存している時に、ダウンロードさせるときは分かりやすいファイル名にしたい!と言ったときに大変役立つかと思います。