使用 Laravel、VueJS 和 Inertiajs 导出 Excel
Export Excel with Laravel, VueJS and Inertiajs
我正在尝试在 Laravel
、VueJS
和 inertiajs
上构建和应用。
我正在使用 maatwebsite/excel
将我的数据导出为 excel 格式。
我有一个具有正常 HTML
形式的 vue 组件
home.vue
<form action="/project-profile" target="_blank" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_token" :value="csrf.content" />
<input type="hidden" name="slug" :value="JSON.stringify(generalDetails.slug)" />
<button class="font-medium tracking-wide">Download Profile</button>
</form>
在安装方法上,我只是放置了我的 csrf
令牌。
mounted() {
this.csrf = document.head.querySelector('meta[name="csrf-token"]');
}
在 Laravel
部分中,我在 web.php
文件中创建了一条路线
Route::post('project-profile','ProjectProfileExportController@ProjectProfile');
每当我尝试导出或提交表单时,我都会收到 page expired
错误,我遵循了一些指南,它说 csrf_token
存在问题但是在检查表单时我可以看到 token
放置得当。
我尝试将其设为 api、api.php
:
Route::post('project-profile', 'ProjectProfileExportController@ProjectProfile');
但是这个东西也没有按预期工作。
Screenshot of page expired screen
Screenshot of inspect form element
欢迎任何更好的方法。谢谢。
Inertia.js 的创建者。
因此,we recommend 不会像这样在每个请求上手动发送 csrf
令牌。
更好的方法是为此使用 axios 中内置的 CSRF 功能。 Axios 是 Inertia 在后台使用的 HTTP 库。
Axios 自动检查是否存在 XSRF-TOKEN
cookie。如果它存在,它将在 X-XSRF-TOKEN
header 中包含它发出的任何请求的令牌。
最简单的实现方式是使用 server-side 中间件。只需在每个响应中包含 XSRF-TOKEN
cookie,然后使用来自 axios 的请求中发送的 X-XSRF-TOKEN
header 验证令牌。
一些框架,例如 Laravel,会自动执行此操作,这意味着不需要配置。因此,我建议从您的模板中删除 csrf-token
元标记,并从您的请求中删除 _token
。这应该可以解决您的问题。
综上所述,请记住,您将无法从 Inertia 请求下载 Excel 文件。所有 Inertia 请求必须 return 一个有效的 Inertia 响应。您可以为此使用 window.open
。像这样:
window.open(`/url/to/excel/download?slug=${generalDetails.}`, '_blank')
我正在尝试在 Laravel
、VueJS
和 inertiajs
上构建和应用。
我正在使用 maatwebsite/excel
将我的数据导出为 excel 格式。
我有一个具有正常 HTML
形式的 vue 组件
home.vue
<form action="/project-profile" target="_blank" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_token" :value="csrf.content" />
<input type="hidden" name="slug" :value="JSON.stringify(generalDetails.slug)" />
<button class="font-medium tracking-wide">Download Profile</button>
</form>
在安装方法上,我只是放置了我的 csrf
令牌。
mounted() {
this.csrf = document.head.querySelector('meta[name="csrf-token"]');
}
在 Laravel
部分中,我在 web.php
文件中创建了一条路线
Route::post('project-profile','ProjectProfileExportController@ProjectProfile');
每当我尝试导出或提交表单时,我都会收到 page expired
错误,我遵循了一些指南,它说 csrf_token
存在问题但是在检查表单时我可以看到 token
放置得当。
我尝试将其设为 api、api.php
:
Route::post('project-profile', 'ProjectProfileExportController@ProjectProfile');
但是这个东西也没有按预期工作。
Screenshot of page expired screen
Screenshot of inspect form element
欢迎任何更好的方法。谢谢。
Inertia.js 的创建者。
因此,we recommend 不会像这样在每个请求上手动发送 csrf
令牌。
更好的方法是为此使用 axios 中内置的 CSRF 功能。 Axios 是 Inertia 在后台使用的 HTTP 库。
Axios 自动检查是否存在 XSRF-TOKEN
cookie。如果它存在,它将在 X-XSRF-TOKEN
header 中包含它发出的任何请求的令牌。
最简单的实现方式是使用 server-side 中间件。只需在每个响应中包含 XSRF-TOKEN
cookie,然后使用来自 axios 的请求中发送的 X-XSRF-TOKEN
header 验证令牌。
一些框架,例如 Laravel,会自动执行此操作,这意味着不需要配置。因此,我建议从您的模板中删除 csrf-token
元标记,并从您的请求中删除 _token
。这应该可以解决您的问题。
综上所述,请记住,您将无法从 Inertia 请求下载 Excel 文件。所有 Inertia 请求必须 return 一个有效的 Inertia 响应。您可以为此使用 window.open
。像这样:
window.open(`/url/to/excel/download?slug=${generalDetails.}`, '_blank')