Grow up

生活とプログラミング

C# で S3 から圧縮ファイルをダウンロードする方法

はじめに

S3 から圧縮ファイルをダウンロードする方法についてまとめます。
今回はWindowsFormアプリケーションを使用しました。
f:id:knkomko:20190630021705p:plain:w450

S3に sample.zip を準備してダウンロードしました。
f:id:knkomko:20190630021909p:plain:w350

ソースコード
using System;
using System.Windows.Forms;

using Amazon.S3;
using Amazon.S3.Transfer;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void DownloadS3Object(string awsBucketName, string keyName)
        {
            AmazonS3Config amazonS3Config = new AmazonS3Config()
            {
                ServiceURL = "https://s3.amazonaws.com"
            };

            AmazonS3Client s3Client = new AmazonS3Client("awsAccessKeyId",
                                                         "awsSecretAccessKey",
                                                         amazonS3Config);

            using (TransferUtility fileTransferUtility = new TransferUtility(s3Client))
            {
                fileTransferUtility.Download(@"C:\temp\" + keyName, awsBucketName, keyName);
            }
        }

        private void Download_Click(object sender, EventArgs e)
        {
            string keyName = "sample.zip";
            DownloadS3Object("awsBucketName", keyName);
        }
    }
}

ダウンロードした圧縮ファイルを展開し、内容も問題ありませんでした。
f:id:knkomko:20190630022112p:plain:w350

不採用のソースコード

GetObjectRequestはダウンロードが出来ても展開はできませんでした。

using System;
using System.Windows.Forms;

using Amazon.S3;
using Amazon.S3.Model;
using System.Runtime.Remoting.MetadataServices;
using System.IO;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Stream DownloadS3Object(string awsBucketName, string keyName)
        {
            AmazonS3Config amazonS3Config = new AmazonS3Config()
            {
                ServiceURL = "https://s3.amazonaws.com"
            };

            AmazonS3Client s3Client = new AmazonS3Client("awsAccessKeyId",
                                                         "awsSecretAccessKey",
                                                         amazonS3Config);
            using (var client = s3Client)
            {
                Stream stream = new MemoryStream();
                GetObjectRequest request = new GetObjectRequest { BucketName = awsBucketName, Key = keyName };
                using (GetObjectResponse response = client.GetObject(request))
                {
                    response.ResponseStream.CopyTo(stream);
                }
                stream.Position = 0;
                return stream;
            }
        }

        private void Download_Click(object sender, EventArgs e)
        {
            string keyName = "sample.zip";
            Stream stream = DownloadS3Object("awsBucketName", keyName);
            MetaData.SaveStreamToFile(stream, @"C:\temp\" + keyName);
        }
    }
}

ダウンロードした圧縮ファイルを展開しようとするとエラーが発生します。
f:id:knkomko:20190630021737p:plain:w350