Asp.net Core Web API - загрузка нескольких изображений из хранилища BLOB-объектов в ZIP-файл (через Axios get) - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь загрузить zip-файл, содержащий несколько файлов (различных типов) - хотя я действительно получаю загрузку zip-файла, он, к сожалению, выдает следующую ошибку при попытке открыть его:

ошибка zip-файла

Изображения хранятся в хранилище BLOB-объектов Azure.

Пожалуйста, помогите, если у вас есть какие-либо идеи.

У меня есть кнопка вмой интерфейс Vue.js, который вызывает следующее:

    GetAllAssetResources ({commit},id)
    {
        console.log("Getting Asset Resources:" + id);
        return new Promise((resolve) => {
            axios.get(CONFIG.platformEndPoints+  '/asset/downloadResources/' + id)
            .then( (response) => {
                const url = window.URL.createObjectURL(new Blob([response.data]));
                const link = document.createElement('a');
                link.href = url;
                link.setAttribute('download', 'resources.zip');
                document.body.appendChild(link);
                link.click();
            })
        })
    }

Это вызывает метод моего контроллера (с использованием C #):

    [HttpGet]
    public async Task<IActionResult> DownloadResources(string guid)
    {
        return File(await _ResourceService.DownloadAllAssetResources(guid), MediaTypeNames.Application.Octet, "resources");
    }

Это вызывает мой сервис:

    public async Task<byte[]> DownloadAllAssetResources(string guid)
    {
        var assetDetails = await _AssetDetails.FindAsync(guid);
        var resources = assetDetails.res.ToList();
        byte[] archiveFile;

        await using (var archiveStream = new MemoryStream())
        {
            using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
            {
                foreach (var file in resources)
                {
                    var fileName = guid+ "_" + file.name;
                    var zipArchiveEntry = archive.CreateEntry(fileName, CompressionLevel.Fastest);
                    var bytes = await _Storage.GetBytes("resources", fileName);

                    await using (var zipStream = zipArchiveEntry.Open())
                    {
                        zipStream.Write(bytes, 0, bytes.Length);
                    }
                }
            }

            archiveFile = archiveStream.ToArray();
        }

        return archiveFile;
    }

1 Ответ

0 голосов
/ 04 ноября 2019

Это был только случай обновления моего вызова axios, чтобы включить тип ответа:

        GetAllAssetResources ({commit},assetDetailid)
    {
        console.log("Getting Asset Resources:" + id);
        return new Promise((resolve) => {
            axios({
                url: CONFIG.platformEndPoints+  '/asset/downloadResources/' + id,
                method: 'GET',
                responseType: 'blob'})
            .then( (response) => {
                const url = window.URL.createObjectURL(new Blob([response.data]));
                const link = document.createElement('a');
                link.href = url;
                link.setAttribute('download', 'resources.zip');
                document.body.appendChild(link);
                link.click();
            })
        })
    },
...