Загрузить большие файлы на s3 с ASP.net MVC - PullRequest
0 голосов
/ 31 января 2011

Существует множество подобных вопросов о переполнении стека, но у меня возникают проблемы с загрузкой большого файла в S3 через MVC.net.

На основании примеров aws .net sdk и некоторых других ответов у меня есть следующее:

public static void UploadToS3(System.IO.Stream stream, string bucketName, string keyName, bool asAttachement)
    {
        AmazonS3 client;
        string accessKey = Settings.ApplicationSettings.AccessKeyID;
        string secretKey = Settings.ApplicationSettings.SecretAccessKeyID;
        // This config ensures s3 works in medium trust.
        AmazonS3Config s3config = new AmazonS3Config();
        s3config.UseSecureStringForAwsSecretKey = false;
        using (client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, s3config))
        {
            try
            {
                PutObjectRequest request = new PutObjectRequest();
                request.WithBucketName(bucketName)
                    .WithKey(keyName)
                    .WithInputStream(stream);


                if (asAttachement)
                {
                    // add headers to ensure asset is downloaded, not opened in browser.
                    request.AddHeaders(Amazon.S3.Util.AmazonS3Util.CreateHeaderEntry("Content-Disposition", "attachment"));
                }

                S3Response response = client.PutObject(request);
                response.Dispose();
            }
            catch(Exception ex)
            {
                throw new ApplicationException("Unable to upload asset." + ex.Message);
            }
        }
    }

Веб-приложение прекрасно работает с небольшими файлами, и большие файлы будут загружаться на сайт (размещенный на Rackspace Cloud Sites), но время ожидания браузера истекает примерно через 30 секунд после публикации http, что недостаточно для загрузки файла. стрим в Амазонку. Браузер отключился от ответа на сервер.

Что мне нужно сделать, чтобы эта работа работала с большими файлами, или как мне загрузить файл на S3?

1 Ответ

1 голос
/ 02 февраля 2011

Судя по всему, в этом участвуют 3 системы.Есть клиент, на котором работает веб-браузер, есть ваш сервер и есть S3.Как я понимаю ваш сценарий, клиент делает запрос на ваш сервер, заставляя ваш сервер загрузить файл на S3.Вы упоминаете, что браузер жалуется, что сервер не отвечает.Возможно, это связано с тем, что ваш сервер загружает файл на S3.Пока ваш сервер загружает объект на S3, он не отправляет какие-либо обновления статуса в браузер.Если загрузка займет достаточно много времени, браузер перестанет ждать.Это не означает, что загрузка не произошла, просто браузер перестал ждать ответа вашего сервера.Что вам нужно сделать, это вернуть клиенту какой-то дополнительный результат.Я не программист .Net, но я, вероятно, хотел бы создать новый поток для загрузки и в потоке запроса вернуть некоторое начальное содержимое, указывающее, что запрос выполняется, очистить этот ответ, но не закрыть вывод,Когда есть цикл, который ожидал загрузки потока, каждые 5 секунд просыпается, чтобы написать пробел и сбросить его клиенту.Это удержит браузер от тайм-аута.

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