Загрузка веб-приложения с хранилища BLOB-объектов Azure на компьютер - PullRequest
0 голосов
/ 23 апреля 2019

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

Я пробовал Environment.SpecialFolder.Peronal, Desktop и т. Д.

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 Ответ

0 голосов
/ 23 апреля 2019

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

Другими словами, когда вы пытаетесь сохранить в 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 result;
    }
}

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

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

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