Различное поведение между изображением типа контента и PDF - PullRequest
0 голосов
/ 21 декабря 2018

У меня проблема с типом содержимого заголовка в PHP.Позвольте мне объяснить.

Я пытаюсь вернуть изображение и файл PDF в угловое приложение V7.

Этот код для изображения работает нормально:

$im = file_get_contents($image_file_name);
header('content-type: image/png');
echo $im;

Я поправляюськапля в углу.Но если я проверю это для моего файла PDF:

$im = file_get_contents($pdf_file_name);
header('content-type: application/pdf');
echo $im;

В Postman файл PDF работает хорошо, и я могу его скачать.Даже в консоли Chrome я хорошо вижу блоб PDF, но в конце я получил ошибку: «Uncaught TypeError: Возвращаемое значение Core \ App :: run () должно быть экземпляром Core \ Response, возвращается ноль»».Эта ошибка происходит из-за моей архитектуры, потому что я жду экземпляра Response, но архитектура между изображением и pdf одинакова, поэтому я не понимаю, почему первый работает, но не второй.В первом случае Response устанавливается после с эхом, но не во втором ... Но если я проверю это:

$im = file_get_contents($pdf_file_name);
header('content-type: image/png');
echo $im;

Я не получил ошибку (но файлконечно не отображается из-за типа содержимого заголовка).Но Ответ хорошо установлен.Есть идеи?

Это мой файл приложения:

/**
     * @param Request $request
     * @return Response
     */
    public function run(Request $request): Response
    {
        if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
            $data = json_decode($request->getContent(), true);
            $request->request->replace(is_array($data) ? $data : array());
        }

        $method = $request->getMethod();

        if ($method === 'OPTIONS') {
            return new Response(json_encode([]));
        }

        $uri = $request->getRequestUri();

        // Strip query string (?foo=bar) and decode URI
        if (false !== $pos = strpos($uri, '?')) {
            $uri = substr($uri, 0, $pos);
        }
        $uri = rawurldecode($uri);
        if (isset($_SERVER['REDIRECT_BASE'])) {
            $uri = str_replace($_SERVER['REDIRECT_BASE'], '', $uri);
        }

        $routeInfo = $this->dispatcher->dispatch($method, $uri);

        try {
            switch ($routeInfo[0]) {
                case FastRoute\Dispatcher::NOT_FOUND:
                    throw new HttpNotFoundException('404 Not Found');
                    break;
                case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
                    $allowedMethods = $routeInfo[1];
                    throw new HttpForbiddenException('Method not allowed : ' . prettyArray($allowedMethods));
                    break;
                case FastRoute\Dispatcher::FOUND:
                    $handler = $routeInfo[1];
                    AnnotationRegistry::registerLoader('class_exists');

                    if (isset($this->requestInterceptor)) {
                        return $this->requestInterceptor->handleRequest($request, $routeInfo);
                    }

                    $vars = $routeInfo[2];
                    //var_dump($vars);
                    $response = null;
                    if (count($vars) > 0) {
                        $args = [];
                        foreach ($vars as $k => $v) {
                            $args[] = $v;
                        }
                        $args[] = $request;

                        $response = call_user_func_array($handler, $args);
                    } else {
                        $response = call_user_func($handler, $request);
                    }

                    return $response;
                    break;
            }
        } catch (QueryException $e) {
            return new Response(json_encode($e->getTrace()));
        } catch (HttpExceptionInterface $e) {
            return $e->asResponse();
        }

//        return new Response();
        return null;
    }
...