Как вернуть 2 документа (PDF и XFDF) с базового контроллера WebAPI C#. NET в SPA? - PullRequest
1 голос
/ 04 февраля 2020

У меня есть SPA и WebAPI.

Пользователь щелкает ссылку на SPA, которая предназначена для загрузки 2 файлов (PDF и XFDF).


У меня есть это действие WebAPI (источник: Что лучший способ обслуживать несколько двоичных файлов из одного метода WebApi? )

    [HttpGet]
    [Route("/api/files/both/{id}")]
    public HttpResponseMessage GetBothFiles([FromRoute][Required]string id)
    {
        StreamContent pdfContent =null;
        {
            var path = "location of PDF on server";
            var stream = new FileStream(path, FileMode.Open);
            pdfContent = new StreamContent(stream);
            pdfContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/vnd.adobe.xfdf");
        }

        StreamContent xfdfContent = null;
        {
            var path = "location of XFDF on server";
            var stream = new FileStream(path, FileMode.Open);
            xfdfContent = new StreamContent(stream);
            xfdfContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/pdf");
        }

        var content = new MultipartContent();
        content.Add(pdfContent);
        content.Add(xfdfContent);
        var response = new HttpResponseMessage();
        response.Content = content;
        return response;
    }

В SPA я делаю это

window.location.href = "/api/files/both/5";

Результат. В браузере это JSON отображается

{
    "Version": "1.1",
    "Content": [{
            "Headers": [{
                    "Key": "Content-Type",
                    "Value": ["application/vnd.adobe.xfdf"]
                }
            ]
        }, {
            "Headers": [{
                    "Key": "Content-Type",
                    "Value": ["application/pdf"]
                }
            ]
        }
    ],
    "StatusCode": 200,
    "ReasonPhrase": "OK",
    "Headers": [],
    "TrailingHeaders": [],
    "RequestMessage": null,
    "IsSuccessStatusCode": true
}

Заголовок ответа (обратите внимание, что content-type = application / json)

HTTP/1.1 200 OK
x-powered-by: ASP.NET
content-length: 290
content-type: application/json; charset=utf-8
server: Microsoft-IIS/10.0
request-context: appId=cid-v1:e6b3643a-19a5-4605-a657-5e7333e7b99a
date: Tue, 04 Feb 2020 11:31:49 GMT
connection: close
Vary: Accept-Encoding

Исходный заголовок запроса (в если это интересно)

Host: localhost:8101
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8101/
DNT: 1
Connection: keep-alive
Cookie: MySession=....
Upgrade-Insecure-Requests: 1

Вопрос

  1. Как запрограммировать метод действия для возврата 2 файлов разных типов?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Вы не можете вернуть 2 разных файла в одном запросе. Вы можете встроить содержимое в объект json, который содержит 2 вещи, но тогда вам придется выработать способ отображения файлов, или вы можете вернуть URI этих 2 файлов, а затем сделать 2 запроса для файлы индивидуально.

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

Надеюсь, это поможет

0 голосов
/ 09 февраля 2020

Другой вариант - сжать оба / несколько файлов и вернуть их как один файл.

...