Веб API Сохранить как PDF - PullRequest
0 голосов
/ 11 марта 2019

У меня есть веб-API, используемый для сохранения некоторых сгенерированных PDF-файлов. Я использую следующий код:

[HttpPut]
[Route("getfile")]
public HttpResponseMessage GenerateFile(RequestView requestView)
{
        var result = new HttpResponseMessage(HttpStatusCode.OK);
using (var stream = new FileStream(@"C:\sample.pdf", FileMode.Open) { Position = 0 })
{
    result.Content = new StreamContent(stream);
    MemoryStream ms = new MemoryStream();
    stream.CopyTo(ms);
    result.Content = new ByteArrayContent(ms.ToArray());
    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = "Sample.pdf" };
    result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
    result.Content.Headers.ContentDisposition.FileName = "Sample.pdf";
    result.Content.Headers.ContentLength = stream.Length;
}

return result;
}

Но что я получаю:

enter image description here

Ответ выглядит так:

%PDF-1.3
%âãÏÓ

1 0 obj
<<
/Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
>>
endobj

2 0 obj
<<
/Type /Outlines
/Count 0
>>
endobj
.
.
.

И заголовки:

enter image description here

У кого-нибудь есть какие-нибудь подсказки, связанные с этим? Спасибо.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Установите содержание ответа на ByteArrayContent вместо StreamContent, также обязательно добавьте .pdf расширение к result.Content.Headers.ContentDisposition.FileName = "Sample.pdf";

[HttpPut]
[Route("getfile")]
public HttpResponseMessage GenerateFile(RequestView requestView)
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
using (var stream = new FileStream(@"C:\sample.pdf", FileMode.Open) { Position = 0 })
{
    result.Content = new StreamContent(stream);
    MemoryStream ms = new MemoryStream();
    stream.CopyTo(ms);
    result.Content = new ByteArrayContent(ms.ToArray());
    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = "Sample.pdf" };
    result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
    result.Content.Headers.ContentDisposition.FileName = "Sample.pdf";
    result.Content.Headers.ContentLength = stream.Length;
}

return result;
}
0 голосов
/ 11 марта 2019

Я заметил пару вещей: во-первых, вы устанавливаете длину контента.Это не должно быть обязательным, и я бы удалил его.

Во-вторых, вы не предоставляете параметры конструктора FileStream для таких вещей, как FileAccess.Я бы заменил это на это, что должно достичь того, что вам нужно:

var stream = File.OpenRead(@"D:\sample.pdf");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...