Я разрабатываю Laravel 5.3 API Brige для загрузки некоторых файлов в различные системы. Чего я хочу добиться:
- Пользователь нажимает кнопку загрузки
- PHP web отправляет запрос cURL на API
- Ответ API может быть файлом или Код HTTP 404
- Браузер клиента показывает диалог загрузки файла
Метод 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
Так что же я делаю неправильно в веб-коде, который показывает мне пустой файл?