лучший способ загрузки больших файлов из облачного хранилища Azure - PullRequest
5 голосов
/ 13 мая 2011

У меня есть веб-приложение MVC, работающее в Azure, которое обслуживает большие файлы, такие как mp3, pdf и т. Д., Которые хранятся в облачном хранилище.Как лучше всего обслуживать эти файлы, чтобы пользователи могли загружать их, нажимая на ссылку / кнопку?

Самый простой способ - просто показать их с помощью:

<a href="...blob.core.windows.net/container/file.mp3">

Но затем пользователь должен щелкнуть правой кнопкой мыши, чтобы загрузить.

Чтобы принудительно загрузить файл, вы можете вернуть File ActionResult:

public ActionResult GetPDF( string filename )
{
    return File( filename, "application/pdf", Server.HtmlEncode( filename ) );
}

Недостаток с этим (я думаю)заключается в том, что веб-ролик должен считывать файлы и выводить их в поток, который будет потреблять ресурсы и потенциально ослаблять роль многих пользователей.Принимая во внимание, что простое решение href link в основном откладывает работу, поэтому браузер общается напрямую с облачным хранилищем.

Я прав?Должен ли я быть обеспокоен дополнительной работой в сети?

Есть ли другой способ принудительно загрузить файл, не обременяя веб-роль?

ОБНОВЛЕНИЕ:

Так что я закончил тем, что загрузил бинарные файлы mp3 с Content-Type "/ octet-stream "- это похоже на форсирование загрузки.Не уверен, что это хорошая практика, но пока она работает.

Ответы [ 3 ]

4 голосов
/ 13 мая 2011

Ваше предположение верно, если вы хотите использовать ActionResult, вам необходимо сначала загрузить файл в веб-роль, а затем передать его клиенту. Если вы хотите избежать этого, особенно с большими файлами, и оставить это для хранилища Azure, потому что тогда Microsoft придется беспокоиться о работе с запросом, вам не придется платить за дополнительные веб-роли, если вы получаете много трафика.

Это хорошо работает, если все файлы, которые вы размещаете, являются публичными, но становится немного хитрее, если вы хотите защитить файлы (посмотрите сигнатуры общего доступа , если это то, что вы хотите сделать ).

Вы пытались установить тип содержимого для блоба? В зависимости от того, как вы загрузили файлы в хранилище BLOB-объектов, они могут быть не установлены. Если вы загружаете большие двоичные объекты с помощью своего собственного кода, вы можете получить к нему доступ через CloudBlob.Attributes.Properties.ContentType (из MSDN )

1 голос
/ 08 декабря 2016

Вы можете вернуть outputFileName, который содержит путь, по которому файл загружается, и отобразить этот путь в интерфейсе с сообщением, что файл был загружен в папку [...]

0 голосов
/ 31 января 2015

Я разработал ActionResult, который получает файл из хранилища, но я не стал выводить его в поток и возвращать загруженный файл, могу ли я получить помощь, пожалуйста, мой код действия: public ActionResult GetPDF (string filename) {

    var storageAccountName = this.User.StorageAccountName;
        var storageAccountKey = this.User.StorageAccountKey;
        string connectionString = string.Format(
                    "DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                     storageAccountName, storageAccountKey);

        //Extraction de votre chaîne de connexion par programme
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

        //Create a CloudFileClient object for credentialed access to File storage.
        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

        //Get a reference to the file share . create a share folder take the name of CompanyCode
        CloudFileShare share = fileClient.GetShareReference(this.User.CompanyCode);

        share.CreateIfNotExists();
        byte[] fileBytes = null;
        // create if not Exist
        if (share.Exists())
        {
            // string StoragePath = "/Uploads/Locations/" + LocationToAdd.Id.ToString();

            CloudFileDirectory rootDirectory = share.GetRootDirectoryReference();
            CloudFileDirectory topDirectory = rootDirectory.GetDirectoryReference("Uploads");
            topDirectory.CreateIfNotExistsAsync();
            CloudFileDirectory midDirectory = topDirectory.GetDirectoryReference("Locations");
            midDirectory.CreateIfNotExistsAsync();
            CloudFileDirectory sampleDir = midDirectory.GetDirectoryReference(document1.LocationId.ToString());
            sampleDir.CreateIfNotExistsAsync();
            //Get a reference to the file we created previously.
            CloudFile file = sampleDir.GetFileReference(filename);

            if (file.Exists())
            {
                //Write the contents of the file to the console window.
                // string fileresult = file.DownloadTextAsync().Result;
                //  file.DownloadToByteArray(fileBytes, 1, null, null, null);

                string outputFileName = Path.GetTempFileName();
                if (System.IO.File.Exists(outputFileName))
                {
                    System.IO.File.Delete(outputFileName);
                }
                OperationContext context = new OperationContext();
                file.DownloadToFileAsync(outputFileName, FileMode.CreateNew, null, null, context);

                // what should i do after this ........
            }
            }
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...