Не удается открыть PDF в новой вкладке с AngularJS - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь открыть документ PDF в новой вкладке с AngularJS.PDF загружается в виде байтового массива из контроллера .NET Web API следующим образом:

[HttpPost]
[Route("PdfDocument")]
public async Task<HttpResponseMessage> GetPdf(int it)
{
    MemoryStream memoryStream = new MemoryStream();
    PdfService pdfService = new PdfService();

    using (var stream = await pdfService.GetDocument(id))
    {
        try
        {
            stream.CopyTo(memoryStream);

            stream.Close();
        }
        catch(Exception ex)
        {
            stream.Close();
            throw new Exception("Exception: ", ex);
        }
    }

    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new ByteArrayContent(memoryStream.ToArray());
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue(System.Net.Mime.DispositionTypeNames.Inline)
    {
        FileName = "file.pdf"
    };

    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");

    return response;
}

В классе PdfService для загрузки документов PDF у меня есть следующие методы:

public async Task<Stream> GetDocument(int id)
{
    try
    {
        var stream = await this.getPdfDocument(id);

        return stream;
    }
    catch (Exception ex)
    {
        throw new Exception("Exception: ", ex);
    }
}

private async Task<Stream> getPdfDocument(int id)
{
    try
    {
        var credentials = new CredentialsCache();
        credentials.Add(....);

        using (var handler = new HttpClientHandler() { Credentials = credentialCache })
        {
            using (var client = new HttpClient(handler))
            {
                client.DefaultRequestHeaders.ExpectContinue = true;

                var stream = await client.GetStreamAsync(id);

                return stream;
            }
        }    
    }
    catch (Exception ex)
    {
        throw new Exception("Exception: ", ex);
    }
}

На стороне клиента код для загрузки байтового массива PDF и его отображения на новой вкладке браузера следующий (это внутри директивы AngularJS):

scope.openPdfInTab = function() {
    var pdfId = 1234;

    scope.pdfParameters = {
        "id": pdfId
    }

    resource.pdf.open(scope.pdfParameters,
        function(data) {
            var file = new Blob([data.content], { type: "application/pdf" });
            var fileURL = URL.createObjectURL(file);

            window.open(file, '_blank');
        }
    );
}

Проблема в том, что ничего не происходит.Новая вкладка не открыта, и в консоли разработчика (в Chrome) нет ошибок, и если я отлаживаю ее, я вижу, как выглядят правильные данные, возвращаемые из Web API.Снимок экрана 1 - это то, как выглядит ответ в контроллере Web API, а снимок экрана 2 содержит данные PDF, файл и URL-адрес файла на стороне клиента.

Снимок экрана 1

Screenshot 1

Снимок экрана 2

Screenshot 2

Я попытался заменить "data.content" на "data" в следующемстрока в коде на стороне клиента, с тем же результатом:

var file = new Blob([data.content], { type: "application/pdf" });

Есть идеи, в чем здесь проблема?

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