使用 Laravel、VueJS 和 Inertiajs 导出 Excel

Export Excel with Laravel, VueJS and Inertiajs

我正在尝试在 LaravelVueJSinertiajs 上构建和应用。

我正在使用 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')