Преобразовать PDF-файл в поток данных в Web API2 и получить обратно PDF на клиенте [дубликат]

Я попробовал это в своем ноутбуке ipython, если я сначала вызову plt.imshow (img) и plt.show () сразу после получения изображения сначала и после него.

280
задан Josh Earl 3 March 2012 в 00:37
поделиться

5 ответов

Перегрузка, которую вы используете, задает нумерацию форматов сериализации. Вам нужно указать тип содержимого явно:

httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
6
ответ дан David Peden 6 September 2018 в 04:29
поделиться

Хотя предлагаемое решение работает нормально, есть еще один способ вернуть массив байтов из контроллера с корректно отформатированным откликом:

  • В запросе установите заголовок «Accept: application / octet-stream ".
  • На стороне сервера добавьте форматтера медиафайлов для поддержки этого типа mime.

К сожалению, WebApi не содержит форматера для« application / октет-поток». В GitHub реализована реализация: BinaryMediaTypeFormatter (есть небольшие адаптации, чтобы заставить его работать для webapi 2, изменены сигнатуры методов).

Вы можете добавить этот форматтер в свою глобальную конфигурацию :

HttpConfiguration config;
// ...
config.Formatters.Add(new BinaryMediaTypeFormatter(false));

WebApi теперь должен использовать BinaryMediaTypeFormatter, если запрос указывает правильный заголовок Accept.

Я предпочитаю это решение, потому что контроллер действия, возвращающий байт [], более удобен для контрольная работа. Хотя другое решение позволяет вам больше контролировать, если вы хотите вернуть другой тип контента, чем «application / octet-stream» (например, «image / gif»).

8
ответ дан Eric Boumendil 6 September 2018 в 04:29
поделиться

Для Web API 2 вы можете реализовать IHttpActionResult. Вот мой:

class FileResult : IHttpActionResult
{
    private readonly string _filePath;
    private readonly string _contentType;

    public FileResult(string filePath, string contentType = null)
    {
        if (filePath == null) throw new ArgumentNullException("filePath");

        _filePath = filePath;
        _contentType = contentType;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(File.OpenRead(_filePath))
        };

        var contentType = _contentType ?? MimeMapping.GetMimeMapping(Path.GetExtension(_filePath));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);

        return Task.FromResult(response);
    }
}

Тогда что-то вроде этого в вашем контроллере:

[Route("Images/{*imagePath}")]
public IHttpActionResult GetImage(string imagePath)
{
    var serverPath = Path.Combine(_rootPath, imagePath);
    var fileInfo = new FileInfo(serverPath);

    return !fileInfo.Exists
        ? (IHttpActionResult) NotFound()
        : new FileResult(fileInfo.FullName);
}

И вот один из способов сообщить IIS игнорировать запросы с расширением, чтобы запрос перейдите к контроллеру:

<!-- web.config -->
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
111
ответ дан Hakam Fostok 6 September 2018 в 04:29
поделиться

Для тех, у кого проблема API, вызываемая более одного раза при загрузке довольно большого файла с использованием метода в принятом ответе, настройте буферизацию ответа на true System.Web.HttpContext.Current.Response.Buffer = true;

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

6
ответ дан lionello 6 September 2018 в 04:29
поделиться

Вы можете попробовать

httpResponseMessage.Content.Headers.Add("Content-Type", "application/octet-stream");
3
ответ дан MickySmig 6 September 2018 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: