Загрузка веб-приложения из больших двоичных объектов хранилища Azure на компьютер

#c# #azure #model-view-controller #download

#c# #azure #модель-представление-контроллер #Скачать

Вопрос:

Я пытаюсь загрузить файлы из Azure на компьютер через веб-приложение. Это работает, когда я запускаю проект локально, но при загрузке на ftp-сервер он не загружается.

Я попробовал среду.Специальная папка.Персональный, настольный и т.д.

 public async Task<bool> DownloadBlobAsync(string file, string fileExtension, string directory)
    {

        string downlaodPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        _container = _client.GetContainerReference(containerName);
        _directoy = _container.GetDirectoryReference(directory);

        CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file   "."   fileExtension);

        using (var fileStream = File.OpenWrite(downlaodPath    "/"  file   "."   fileExtension))
        {
            await blockBlob.DownloadToStreamAsync(fileStream);

            return true;
        }
    }
  

Ожидаемый результат должен быть в документах или на рабочем столе.

Комментарии:

1. Если вы размещаете веб-приложение на веб-сервере, то весьма вероятно, что у вас нет доступа к рабочему столу или личной папке. Это может быть связано с тем, что веб-приложение работает под специальной учетной записью пользователя, которая имеет ограничения на то, к чему оно может получить доступ в отношении локального компьютера. Я хотел бы загрузить большой двоичный объект во временную папку (есть API, которые помогут вам сгенерировать имя временного файла, которое находится в расположении, к которому веб-приложение будет иметь доступ). Стоило бы обновить ваш вопрос, указав подробную информацию о том, что вы хотите сделать с файлом после его загрузки.

2. Это для загрузки файлов, которые они выбирают. Например, существует файл с именем myimage.png. Они могут щелкнуть по нему и загрузить его.

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

Ответ №1:

Проблема, которую вы видите, связана с тем, что ваш код выполняется на веб-сервере, а не на компьютере клиентов (пользователей).

Другими словами, когда вы пытаетесь сохранить в Environment.SpecialFolder.Personal , вы пытаетесь сохранить его в эту папку на веб-сервере, а не на настольном компьютере пользователя.

Что вам нужно сделать, это вернуть содержимое большого двоичного объекта в запросе и позволить браузеру сохранить файл — пользователю, скорее всего, будет предложено (в зависимости от настроек его браузера), где именно его сохранить. Вы не должны указывать это.

Вот пример того, как это сделать:

 public async Task<HttpResponseMessage> DownloadBlobAsync(string file, string fileExtension, string directory)
{
    _container = _client.GetContainerReference(containerName);
    _directoy = _container.GetDirectoryReference(directory);

    CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file   "."   fileExtension);

    using (var ms = new MemoryStream())
    {
        await blockBlob.DownloadToStreamAsync(ms);

        var result = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ByteArrayContent(ms.ToArray())
        };

        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "somefilename.ext"
        };
        result.Content.Headers.ContentType = new MediaTypeHeaderValue(blockBlob.Properties.ContentType);

        return resu<
    }
}
  

Обратите внимание, что это неэффективно, так как сначала большой двоичный объект будет загружен на веб-сервер, а затем возвращен клиенту. Этого должно быть достаточно для начала.

Когда браузер обнаружит эту конечную точку, пользователю будет предложено сохранить файл где-нибудь на своем компьютере.

Комментарии:

1. Таким образом, я мог бы использовать jquery для извлечения файла и разрешить пользователю сохранять его. Вопрос: результат. Содержание. Заголовки. ContentType = новое значение MediaTypeHeaderValue (res.ContentType); Какое значение в конце? Я не вижу переменной для его объявления или передачи ему

2. Результат. Содержание. Заголовки. ContentType = новое значение MediaTypeHeaderValue(блокблок. Свойства. ContentType); Я думаю, что это то, что происходит в этой строке

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

4. То, что я сделал, просто сделало Azure общедоступным, чтобы я мог загружать ссылки напрямую. Это упростило задачу, и поскольку все эти файлы в любом случае будут доступны для скачивания, у blob-объекта нет причин быть закрытым.