Подтвердить что ты не робот

Как загрузить файл на Amazon S3 очень просто, используя С#

Я устал от всех этих "загрузок на S3" примеров и обучающих программ, которые не работают, может кто-нибудь просто покажет мне пример, который просто работает и очень просто?

4b9b3361

Ответ 1

ну вот инструкция, которой вы должны следовать, чтобы получить полностью работающую демонстрационную программу...

1-Загрузите и установите SDK веб-сервисов Amazon для .NET, который вы можете найти в (http://aws.amazon.com/sdk-for-net/). Поскольку у меня есть Visual Studio 2010, я решил установить 3.5.NET SDK.

2- Откройте Visual Studio и создайте новый проект, у меня Visual Studio 2010, и я использую проект консольного приложения.

3- добавить ссылку на AWSSDK.dll, он устанавливается вместе с упомянутым выше SDK веб-службы Amazon, в моей системе dll находится в "C:\Program Files (x86)\AWS SDK для .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 и секретному ключу доступа.

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- добавьте исправление ошибок, и ваша программа готова

Ответ 2

Решение @docesam предназначено для старой версии AWSSDK. Вот пример с последней документацией AmazonS3:

1) Сначала откройте Visual Studio (я использую VS2015) и создаю новый проект веб-приложение ASP.NET . MVC.

2) Просмотрите в разделе "Управление пакетом Nuget" пакет 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) Отредактируйте файл Web.config, добавив следующие строки внутри <appSettings></appSettings>:

<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) Теперь вызовите ваш метод UploadFile из HomeController.cs, чтобы проверить его:

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

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

6) Найдите свой файл в своем ковре Amazon S3 и все.

Загрузить демонстрационный проект

Ответ 3

Решение @mejiamanuel57 отлично работает для небольших файлов размером до 15 МБ. Для больших файлов я получал System.Net.Sockets.SocketException: The I/O operation has been aborted because of either a thread exit or an application request. Следующее улучшенное решение работает для больших файлов (протестировано с файлом 50 МБ):

...
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
    }
...

Больше информации здесь.

Ответ 4

Я недавно использовал WinSCP, который напрямую подключается к Amazon S3. Очень просто, как FTP.

Ответ 5

Я последовал за этим, но получаю:

К корзине, к которой вы пытаетесь получить доступ, необходимо обратиться с помощью указанной конечной точки. Пожалуйста, отправляйте все будущие запросы на эту конечную точку.

Я звоню ниже, используя:

            bool _ret = await AWS.Send_File_To_S3(_base64, "mybucket", "", "test.png");

           ==========================

            byte[] _bytes = System.Convert.FromBase64String(_base64.Substring(_base64.IndexOf(',') + 1));

            IAmazonS3 client = new AmazonS3Client(_access_key, _access_secret, RegionEndpoint.SAEast1);
            TransferUtility utility = new TransferUtility(client);
            TransferUtilityUploadRequest request = new TransferUtilityUploadRequest();

            if (string.IsNullOrEmpty(_subDirectoryInBucket))
            {
                request.BucketName = _bucketName; 
            }
            else
            {   // subdirectory and bucket name  
                request.BucketName = _bucketName + @"/" + _subDirectoryInBucket;
            }
            request.Key = _fileNameInS3; //file name up in S3  
            request.InputStream = new MemoryStream(_bytes);
            await utility.UploadAsync(request); //commensing the transfer  

Что я пропустил?

Пожалуйста, помогите, спасибо Дон

Ответ 6

Загрузка файла в корзину S3 с использованием низкоуровневого API:

IAmazonS3 client = new AmazonS3Client("AKI...access-key...", "+8Bo...secrey-key...", RegionEndpoint.APSoutheast2);  

FileInfo file = new FileInfo(@"c:\test.txt");  
string destPath = "folder/sub-folder/test.txt";
PutObjectRequest request = new PutObjectRequest()  
{  
    InputStream = file.OpenRead(),  
    BucketName = "my-bucket-name",  
    Key = destPath // <-- in S3 key represents a path  
};  

PutObjectResponse response = client.PutObject(request); 

Загрузка файла в корзину S3 с использованием высокоуровневого API:

IAmazonS3 client = new AmazonS3Client("AKI...access-key...", "+8Bo...secrey-key...", RegionEndpoint.APSoutheast2);  

FileInfo localFile = new FileInfo(@"c:\test.txt");  
string destPath = @"folder\sub-folder\test.txt";  

S3FileInfo s3File = new S3FileInfo(client, "my-bucket-name", destPath);  
if (!s3File.Exists)  
{  
    using (var s3Stream = s3File.Create()) // <-- create file in S3  
    {  
        localFile.OpenRead().CopyTo(s3Stream); // <-- copy the content to S3  
    }  
}  

Для получения дополнительной информации см. мой учебник.

Ответ 7

Пример на сайте AWS работал для меня: https://docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html

Хотя он был установлен в другой регион, который возвратил ошибку:

//приватное статическое чтение только RegionEndpoint bucketRegion = RegionEndpoint.USWest2; частная статическая только для чтения RegionEndpoint bucketRegion = RegionEndpoint.USWest1;

Я настроил свое ведро с Северной Калифорнией, которая является USWest1.