Laravel API возвращает файл, и клиент должен показать диалог загрузки - PullRequest
0 голосов
/ 24 февраля 2020

Я разрабатываю Laravel 5.3 API Brige для загрузки некоторых файлов в различные системы. Чего я хочу добиться:

  1. Пользователь нажимает кнопку загрузки
  2. PHP web отправляет запрос cURL на API
  3. Ответ API может быть файлом или Код HTTP 404
  4. Браузер клиента показывает диалог загрузки файла

Метод APi:

    $reportService = new ReportService($request->get('vRefGMS'));
    $reportData = $reportService->handle();
    if ($reportData) {
        $serverService = new NetServerService($reportData);
        $csvFile = $serverService->handle();
        if ($csvFile != null) {
            return response()->file($csvFile);
        } else {
            return abort(404);
        }
    } else {
        return abort(404);
    }

Теперь я покажу вам код, который я пробовал.

PHP код в Интернете для загрузки:

    $uri = $this->getEndpointShow($this->reportCode, SELF::ENDPOINT_REPORT_DOWNLOAD);
    $file = $this->apiConnection->downloadReport($uri, $this->reportCode);
    if ($file) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file) . '"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        flush();
        readfile($file);
    } else {
        echo "alert('Can´t find a report file')";
    }

И метод downloadReport:

public function downloadReport($uri, $reportCode)
{
    if (!$reportCode) {
        throw new InvalidArgumentException("No report Code");
    }
    $cURLConnection = curl_init();
    curl_setopt($cURLConnection, CURLOPT_URL, self::BASE_API_URL . $uri);
    curl_setopt($cURLConnection, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($cURLConnection, CURLOPT_POST, TRUE);
    curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, "vRefGMS=$reportCode");
    curl_setopt($cURLConnection, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . self::API_ACCESS_TOKEN
    ]);

    $response = curl_exec($cURLConnection);

    if ($response === false) {
        throw new Exception(curl_error($cURLConnection), curl_errno($cURLConnection));
    }

    curl_close($cURLConnection);

    return $response;
}

Как видно из кода PHP для загрузки У меня есть $file var, который всегда остается пустым $file = ''. Я также попробовал API с return response()->download($csvFile) с тем же результатом.

Возможно, я неправильно понимаю концепции, но не могу добиться загрузки файла. Как получить этот файл?

РЕДАКТИРОВАТЬ:

API возвращает файл, потому что, если я go на cli, чтобы сделать запрос cURL к API вот ответ:

curl http://localhost:8080/test


StatusCode        : 200
StatusDescription : OK
Content           : 1;!;1;1;
RawContent        : HTTP/1.1 200 OK
                    Accept-Ranges: bytes
                    Content-Length: 8
                    Cache-Control: public
                    Date: Mon, 24 Feb 2020 01:59:37 GMT
                    Last-Modified: Mon, 24 Feb 2020 12:11:04 GMT
                    Set-Cookie: XSRF-TOKEN=eyJpdiI6ImdFb...
Forms             : {}
Headers           : {[Accept-Ranges, bytes], [Content-Length, 8], [Cache-Control, public], [Date, Mon, 24 Feb 2020
                    01:59:37 GMT]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 8

Так что же я делаю неправильно в веб-коде, который показывает мне пустой файл?

...