Я разрабатываю веб-приложение, используя React JS для внешнего интерфейса и Laravel для внутреннего API. Теперь я пытаюсь получить данные Excel из серверной части с помощью Axios, а затем загрузить файл.
Это мой метод действия контроллера API Laravel.
function downloadExcel(Request $request)
{
//other code goes here
return Excel::create($left_photo->id . "-" . $right_photo->id, function($excel) use ($excel_data)
{
// Set the spreadsheet title, creator, and description
$excel->setTitle('Mapping points');
$excel->setCreator('Laravel')->setCompany('Memento');
$excel->setDescription('Mapping points file');
// Build the spreadsheet, passing in the payments array
$excel->sheet('sheet1', function($sheet) use ($excel_data)
{
$sheet->fromArray($excel_data, null, 'A1', false, false);
});
})->download('xlsx');
}
Я получаю данные из приложения response js, используя Axios следующим образом.
export const getHttpClientFileDownload = (path) => {
let accessToken = localStorage.getItem("access_token");
return Axios({
url: getApiBaseEndpoint() + path,
method: 'GET',
responseType: 'blob', // important
headers : { 'api-version': API_VERSION, 'Authorization': 'Bearer ' + accessToken }
})
}
exportExcel()//this is the download medthod in the component
{
let path = 'photos/matching-points/excel?left_photo_id=' + this.props.leftImageId + "&right_photo_id = " + this.props.rightImageId;
//let path = "curator/event/" +this.props.match.params.id + "/details";
getHttpClientFileDownload(path)
.then((response) => {
alert('Everything is alright')
})
}
Как вы можете видеть в приведенном выше коде, в случае успеха запроса должно появиться сообщение «Все в порядке». Но это не предупреждающее сообщение. Но в браузере успешно.
Когда я делаю запрос на ссылку, которая возвращает обычный ответ JSON, она предупреждает сообщение, как и ожидалось. Только он не работает должным образом, когда я делаю запрос к вышеупомянутому API Excel.
Я не могу использовать прямую ссылку для загрузки, потому что я выполняю некоторую авторизацию на стороне сервера.


Вы можете просто использовать window.open (путь) для загрузки файлов
У меня была такая же проблема, и я нашел решение, как показано ниже. Шаги:
Мой код выглядит так. Я использовал fetch API. Код на стороне клиента:
const response = await fetch("my_server_url.com/api/createFile", {
method: 'GET',
headers: {
Authorization: "Bearer " + this.$store.state.AccessToken,
"X-Requested-With": "XMLHttpRequest",
},
});
if (!response.ok) {
console.info(response)
throw new Error("Something went wrong!");
}
const data = await response.json();
window.open("my_server_url.com/downloadFile/name = "+data, '_blank');
Код в маршруте my_server_url.com/api/createFile: (api.php)
public function createFile()
{
$file_name= date('YmdHis').rand();
Excel::store(new myExport(), $file_name.'.xlsx', 'local');
return response()->json($file_name.'.xlsx', 200);
}
Код в маршруте my_server_url.com/downloadFile/name = {file_name}: (web.php)
public function downloadFile($file_name)
{
return response()->download(Storage::path($file_name))->deleteFileAfterSend(true);
}
Таким образом, вы можете проверить авторизацию и логику, но уже через API. Также не забудьте добавить use Illuminate\Support\Facades\Storage; в контроллер laravel.
Я не могу использовать прямую ссылку для загрузки, потому что я выполняю некоторую авторизацию на стороне сервера