Не могу загрузить файл в aws s3 asp.net - PullRequest
0 голосов
/ 28 мая 2020
 fileTransferUtility = new TransferUtility(s3Client);
        try
        {
            if (file.ContentLength > 0)
            {
                var filePath = Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName));
                var fileTransferUtilityRequest = new TransferUtilityUploadRequest
                {
                    BucketName = bucketName,
                    FilePath = filePath,
                    StorageClass = S3StorageClass.StandardInfrequentAccess,
                    PartSize = 6291456, // 6 MB.  
                    Key = keyName,
                    CannedACL = S3CannedACL.PublicRead
                };
                fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
                fileTransferUtilityRequest.Metadata.Add("param2", "Value2");
                fileTransferUtility.Upload(fileTransferUtilityRequest);
                fileTransferUtility.Dispose();
            }

Я получаю эту ошибку Файл, указанный свойством FilePath, не существует!

Я попытался изменить путь к фактическому пути к файлу на C: \ Users \ jojo \ Downloads, но я все еще получаю ту же ошибку.

1 Ответ

1 голос
/ 28 мая 2020

(на основе комментария выше, указывающего, что file является экземпляром HttpPostedFileBase в веб-приложении ...)

Я не знаю, откуда вы взяли Server.MapPath("~/Files"), но если file - это HttpPostedFileBase, который был загружен в этот код веб-приложения, тогда он, скорее всего, находится в памяти, а не в вашей файловой системе. Или, в лучшем случае, это где-то в файловой системе в какой-то временной системной папке.

Поскольку ваш источник (содержимое переменной file) является потоком, прежде чем вы попытаетесь взаимодействовать с файловой системой, вы должны увидеть, AWS API, который вы используете, может принимать поток. И похоже, что может.

if (file.ContentLength > 0)
{
    var transferUtility = new TransferUtility(/* constructor params here */);
    transferUtility.Upload(file.InputStream, bucketName, keyName);
}

Обратите внимание, что это полностью произвольно, я не очень знаком с взаимодействиями AWS. И вы обязательно захотите взглянуть на конструкторы на TransferUtility, чтобы увидеть, какой из них соответствует вашему дизайну. Но дело в том, что вы сейчас хотите загрузить поток из файла, который вы уже загрузили в свое веб-приложение, а не хотите загрузить реальный файл из файловой системы. .

В качестве запасного варианта, если вы не можете заставить загрузку потока работать (а вам действительно стоит, это идеальный подход), тогда ваш следующий вариант, скорее всего, сначала сохранит файл, а затем загрузит его, используя метод, который вы есть сейчас. Поэтому, если вы ожидаете, что он будет в Server.MapPath("~/Files"), вам нужно сначала сохранить его в этой папке, например:

file.SaveAs(Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName)));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...