Загрузка данных Excel с помощью Axios из серверной части Laravel не работает

Я разрабатываю веб-приложение, используя 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')
        })
    }

Как вы можете видеть в приведенном выше коде, в случае успеха запроса должно появиться сообщение «Все в порядке». Но это не предупреждающее сообщение. Но в браузере успешно.

Загрузка данных Excel с помощью Axios из серверной части Laravel не работает

Когда я делаю запрос на ссылку, которая возвращает обычный ответ JSON, она предупреждает сообщение, как и ожидалось. Только он не работает должным образом, когда я делаю запрос к вышеупомянутому API Excel.

Я не могу использовать прямую ссылку для загрузки, потому что я выполняю некоторую авторизацию на стороне сервера.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
1 475
2

Ответы 2

Вы можете просто использовать window.open (путь) для загрузки файлов

Я не могу использовать прямую ссылку для загрузки, потому что я выполняю некоторую авторизацию на стороне сервера

Wai Yan Hein 31.07.2018 17:04

У меня была такая же проблема, и я нашел решение, как показано ниже. Шаги:

  1. Вызов API на серверную часть Laravel. Создайте файл и сохраните его в локальном драйвере на сервере.
  2. Верните имя файла клиенту.
  3. Создайте общедоступный маршрут в Laravel (в web.php) для загрузки файлов из локального хранилища. Этот маршрут удалит файл после его загрузки.
  4. Со стороны клиента перенаправьте пользователя на этот общедоступный URL-адрес с именем файла.

Мой код выглядит так. Я использовал 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.

Другие вопросы по теме