Веб-API: скачать несколько файлов отдельно - PullRequest
0 голосов
/ 24 августа 2018

У меня есть метод контроллера Web Api, который получает переданные идентификаторы документов, и он должен возвращать файлы документов отдельно для запрашиваемых идентификаторов.Я попробовал принятый ответ по следующей ссылке для достижения этой функциональности, но он не работает.Я не знаю, где я ошибся.

https://stackoverflow.com/questions/12266422/whats-the-best-way-to-serve-up-multiple-binary-files-from-a-single-webapi-metho

Мой метод веб-API,

   public async Task<HttpResponseMessage> DownloadMultiDocumentAsync( 
             IClaimedUser user, string documentId)
    {
        List<long> docIds = documentId.Split(',').Select(long.Parse).ToList();
        List<Document> documentList = coreDataContext.Documents.Where(d => docIds.Contains(d.DocumentId) && d.IsActive).ToList();

        var content = new MultipartContent();
        CloudBlockBlob blob = null;

        var container = GetBlobClient(tenantInfo);
        var directory = container.GetDirectoryReference(
            string.Format(DirectoryNameConfigValue, tenantInfo.TenantId.ToString(), documentList[0].ProjectId));

        for (int docId = 0; docId < documentList.Count; docId++)
        {
            blob = directory.GetBlockBlobReference(DocumentNameConfigValue + documentList[docId].DocumentId);
            if (!blob.Exists()) continue;

            MemoryStream memStream = new MemoryStream();
            await blob.DownloadToStreamAsync(memStream);
            memStream.Seek(0, SeekOrigin.Begin);
            var streamContent = new StreamContent(memStream);
            content.Add(streamContent);

        }            
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
        httpResponseMessage.Content = content;
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        return httpResponseMessage;
    }

Я пытался использовать 2 или более идентификатора документа, но загрузил только один файл, а такжене в правильном формате (без расширения).

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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

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

public ActionResult Download()
{
    using (ZipFile zip = new ZipFile())
    {
        zip.AddDirectory(Server.MapPath("~/Directories/hello"));

        MemoryStream output = new MemoryStream();
        zip.Save(output);
        return File(output, "application/zip", "sample.zip");
    }  
}
0 голосов
/ 24 августа 2018

Zipping - единственная опция, которая будет иметь стабильный результат во всех браузерах. MIME / составное содержимое предназначено для сообщений электронной почты (https://en.wikipedia.org/wiki/MIME#Multipart_messages)), и оно никогда не предназначалось для получения и анализа на стороне клиента транзакции HTTP. Некоторые браузеры реализуют это, а некоторые - нет.

Кроме того, вы можете изменить свой API-интерфейс на один docId и выполнить итерацию своего API-интерфейса от клиента для каждого docId.

...