Pull to refresh

Comments 20

UFO just landed and posted this here
Не нужно.

Для больших файлов можно воспользоваться асинхронной загрузкой.
UFO just landed and posted this here
Файл не всегда находиться на диске, в моем случае (не в примере выше) это был поток.
UFO just landed and posted this here
Не знаю, это надо тестить, у меня органичение на 1мб файлы от пользователей :)
UFO just landed and posted this here
Файлы можно резать и отправлять будут кусками и можно выбирать на сколько потоков распараллеливать этот процесс. Я тестировал с фильмом на 1.4 гига, прошло без проблем.
А можно было бы посмотреть на код реализации?
как-то так
using (var client = new AmazonS3Client(this.settings.AwsAccessKey, this.settings.AwsSecretKey))
                    {
                        var transferUtilityConfig = new TransferUtilityConfig();
                        transferUtilityConfig.DefaultTimeout = this.settings.FileUploadTimeout * 1000;
                        transferUtilityConfig.NumberOfUploadThreads = 1;

                        using (var transferUtility = new TransferUtility(client, transferUtilityConfig))
                        {
                            var transferUtilityUploadRequest = new TransferUtilityUploadRequest();
                            transferUtilityUploadRequest.WithBucketName(this.settings.BucketName)
                                .WithFilePath(filePath)
                                .WithKey(fileIndex.ToString())
                                .WithPartSize(this.settings.FileUploadPartSize * 1024);

                            transferUtility.Upload(transferUtilityUploadRequest);
                        }
                    }
Не должен он отжирать 1 гб памяти. Файловые потоки в дотнете устроены таким образом, что создается буфер (по умолчанию 4 кб кажется), который считывается. Когда буфер заполнен, его содержимое сбрасывается в файл (flush). Именно размер этого буфера вы и устанавливаете, когда задаете размер потока.
Так что кушаться память должна только под буфер.
UFO just landed and posted this here
Вы написали:
>А разве при использовании потока не нужно явно задавать размер?
>Странно. А в SDK для Java написано:…
>А гигабайтный файл нормально получается загрузить таким образом?
Ответ был на это.
Не знаю как в яве, но в дотнет (в статье речь о нем идет) с этим проблем не будет, и определять размер файла не обязательно. Это скорее нужно что бы человеку показать сколько качается и сколько осталось, если файл большой, но это уже другая история.
Да, не обратил внимание что определение размера — это требование SDK. Но к зажор памяти явное не указание размера вызвать не может.
UFO just landed and posted this here
UFO just landed and posted this here
Собственно я говорил не про абстрактный поток, а про реализацию файловых потоков в дотнете, т.к. именно их использовали в статье, и мне показалось (видимо ошибочно) что вы спросили про возможность ошибочного поведения в представленном примере.
В общем случае это момент который нужно учитывать, но как я уже сказал, в данном примере с этим проблемы возникать не будут.
Думаю теперь мы друг друга понял :)
Я бы еще отметил, что совместно с s3 хранилищем может возникнуть необходимость использовать CloudFront для авторизованного доступа к определенному контенту. CloudFront кэширует файлы к которым было обращение, поэтому если в s3 обновился файл, а кэш на CloudFront еще не истек (по умолчанию сутки), то вы получите старый файл. Когда мы с таким столкнулись, то нашли два варианта решения проблемы:
1) можно отправить запрос на CloudFront для обновления кэша, у этого метода есть ограничения:
— выполняется не сразу, а в течении минут 10-20
— ограничение на 3 одновременных запроса
2) (именно этим вариантом мы и воспользовались) называть файлы уникальным именем и при обновлении файла удалять старый, а новый создавать с новым именем. Мы использовали guid, такая схема вполне себе работоспособна.
Также пользуюсь вторым вариантом, только старые файлы некоторое время не удаляю, что бы не бились недавние ссылки, например, со сторонних ресурсов (у меня веб приложение).
У нас было ограничение, чтобы ссылка на файл была доступна как можно меньше времени. А для текущего пользователя, раз уже кликнул, то файл выкачается до конца, сколько бы это не заняло времени.
Sign up to leave a comment.

Articles