web-dev-qa-db-ja.com

C#を使用してファイルをAmazon S3に簡単にアップロードする方法

私はこれらすべての「S3へのアップロード」の例と機能しないチュートリアルにうんざりしています。単に機能するだけで非常に簡単な例を見せてもらえますか?

39
EKanadily

デモプログラムを完全に機能させるには、次の手順に従ってください...

1 ---(http://aws.Amazon.com/sdk-for-net/ )にある.NET用のAmazon WebサービスSDKをダウンロードしてインストールします。 Visual Studio 2010があるため、3.5 .NET SDKをインストールすることにしました。

2- Visual Studioを開いて新しいプロジェクトを作成します。VisualStudio 2010があり、コンソールアプリケーションプロジェクトを使用しています。

3- AWSSDK.dllへの参照を追加します。上記のAmazon WebサービスSDKと共にインストールされます。私のシステムでは、dllは "C:\ Program Files(x86)\ AWS SDK for .NET\bin\Net35\AWSSDKにあります.dll」。

4-新しいクラスファイルを作成し、ここでクラスの完全なコードを「AmazonUploader」と呼びます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;

namespace UploadToS3Demo
{
    public class AmazonUploader
    {
        public bool sendMyFileToS3(string localFilePath, string bucketName, string subDirectoryInBucket, string fileNameInS3)
        {
        // input explained :
        // localFilePath = the full local file path e.g. "c:\mydir\mysubdir\myfilename.Zip"
        // bucketName : the name of the bucket in S3 ,the bucket should be alreadt created
        // subDirectoryInBucket : if this string is not empty the file will be uploaded to
            // a subdirectory with this name
        // fileNameInS3 = the file name in the S3

        // create an instance of IAmazonS3 class ,in my case i choose RegionEndpoint.EUWest1
        // you can change that to APNortheast1 , APSoutheast1 , APSoutheast2 , CNNorth1
        // SAEast1 , USEast1 , USGovCloudWest1 , USWest1 , USWest2 . this choice will not
        // store your file in a different cloud storage but (i think) it differ in performance
        // depending on your location
        IAmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(RegionEndpoint.EUWest1);

        // create a TransferUtility instance passing it the IAmazonS3 created in the first step
        TransferUtility utility = new TransferUtility(client);
        // making a TransferUtilityUploadRequest instance
        TransferUtilityUploadRequest request = new TransferUtilityUploadRequest();

        if (subDirectoryInBucket == "" || subDirectoryInBucket == null)
        {
            request.BucketName = bucketName; //no subdirectory just bucket name
        }
        else
        {   // subdirectory and bucket name
            request.BucketName = bucketName + @"/" + subDirectoryInBucket;
        }
        request.Key = fileNameInS3 ; //file name up in S3
        request.FilePath = localFilePath; //local file name
        utility.Upload(request); //commensing the transfer

        return true; //indicate that the file was sent
    }
  }
}

5-構成ファイルの追加:ソリューションエクスプローラーでプロジェクトを右クリックし、[追加]-> [新しい項目]を選択して、リストから[アプリケーション構成ファイル]タイプを選択し、[追加]ボタンをクリックします。 「App.config」というファイルがソリューションに追加されます。

6- app.configファイルの編集:ソリューションエクスプローラーで「app.config」ファイルをダブルクリックして、編集メニューを表示します。すべてのテキストを次のテキストに置き換えます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="AWSProfileName" value="profile1"/>
    <add key="AWSAccessKey" value="your Access Key goes here"/>
    <add key="AWSSecretKey" value="your Secret Key goes here"/>

  </appSettings>
</configuration>

上記のテキストを変更して、AmazonアクセスキーIDとシークレットアクセスキーを反映する必要があります。

7-今program.csファイル(これはコンソールアプリケーションであることを思い出してください)に次のコードを記述します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UploadToS3Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            // preparing our file and directory names
            string fileToBackup = @"d:\mybackupFile.Zip" ; // test file
            string myBucketName = "mys3bucketname"; //your s3 bucket name goes here
            string s3DirectoryName = "justdemodirectory";
            string s3FileName = @"mybackupFile uploaded in 12-9-2014.Zip";

            AmazonUploader myUploader = new AmazonUploader();
            myUploader.sendMyFileToS3(fileToBackup, myBucketName, s3DirectoryName, s3FileName);
        }
    }
}

8-上記のコードの文字列を独自のデータで置き換えます

9-エラー修正を追加し、プログラムの準備ができました

52
EKanadily

@docesamのソリューションは、AWSSDKの古いバージョン用です。 ここにAmazonS3の最新のドキュメントの例があります:

1)最初にVisual Studio(VS2015を使用しています)を開き、新しいプロジェクトを作成します->ASP.NET Webアプリケーション->MVC。

2)Manage Nuget PackageでパッケージAWSSDK.S3を参照してインストールします。

3)AmazonS3Uploaderという名前のクラスを作成し、このコードをコピーして貼り付けます:

using System;
using Amazon.S3;
using Amazon.S3.Model;

namespace AmazonS3Demo
{
    public class AmazonS3Uploader
    {
        private string bucketName = "your-Amazon-s3-bucket";
        private string keyName = "the-name-of-your-file";
        private string filePath = "C:\\Users\\yourUserName\\Desktop\\myImageToUpload.jpg"; 

        public void UploadFile()
        {
            var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

            try
            {
                PutObjectRequest putRequest = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    FilePath = filePath,
                    ContentType = "text/plain"
                };

                PutObjectResponse response = client.PutObject(putRequest);
            }
            catch (AmazonS3Exception amazonS3Exception)
            {
                if (amazonS3Exception.ErrorCode != null &&
                    (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                    ||
                    amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                {
                    throw new Exception("Check the provided AWS Credentials.");
                }
                else
                {
                    throw new Exception("Error occurred: " + amazonS3Exception.Message);
                }
            }
        }
    }
}

4)<appSettings></appSettings>内に次の行を追加して、Web.configファイルを編集します。

<add key="AWSProfileName" value="any name for your profile"/>
<add key="AWSAccessKey" value="your Access Key goes here"/>
<add key="AWSSecretKey" value="your Secret Key goes here"/>

5)次に、HomeController.csからメソッドUploadFileを呼び出してテストします。

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            AmazonS3Uploader amazonS3 = new AmazonS3Uploader();

            amazonS3.UploadFile();
            return View();
        }
    ....

6)Amazon S3バケットでファイルを見つけたら、それで終わりです。

デモプロジェクトをダウンロード

41
mejiamanuel57

@ mejiamanuel57のソリューションは、15MB未満の小さなファイルに対して正常に機能します。大きなファイルの場合、System.Net.Sockets.SocketException: The I/O operation has been aborted because of either a thread exit or an application request。次の改善されたソリューションは、大きなファイルで機能します(50MBファイルでテスト済み):

...
public void UploadFile()
{
    var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
    var transferUtility = new TransferUtility(client);

    try
    {
        TransferUtilityUploadRequest transferUtilityUploadRequest = new TransferUtilityUploadRequest
        {
            BucketName = bucketName,
            Key = keyName,
            FilePath = filePath,
            ContentType = "text/plain"
        };

        transferUtility.Upload(transferUtilityUploadRequest); // use UploadAsync if possible
    }
...

詳細 こちら

1
xhafan