在 Inertia.js Post 之后,有什么方法可以在控制器中下载文件 (PDF) 吗?

Is There Any Way to Download a File (PDF) in the Controller After Inertia.js Post?

我将 Laravel 8 与 Jetstream Vuejs 和 Inertiajs 一起使用,我正在尝试下载在我的控制器中生成的 PDF。

我 post 我的表格数据:

previewPDF() {
      this.$inertia.post("/tracker/preview-pdf", this.form);
    },

然后在我的控制器中 select 所需的数据并生成 pdf 以供下载:

function previewPDF(Request $request) {
       
       $pdfData = $this->getPDFData($request);
       $domainData = $this->getDomainData($request);
       $hourSumData = $this->getHourSumData($request);
       $userData = Auth::user();
       
       $pdf = PDF::loadView('trackerPDF', ['pdfData' => $pdfData, 'domainData' => $domainData, 'hourSumData' => $hourSumData, 'userData' => $userData]);

       return $pdf->download("pdfname.pdf");
   }

由于我 post 使用 Inertia 编辑了数据,我的响应显示为如下模态:

对此的一般想法似乎是不使用 Inertia 进行文件下载:

有什么方法可以在仍然使用 Inertia 的情况下做到这一点吗?如果没有,是否有正确的方法来处理这个 posting 我的所有表单数据而不仅仅是 <a> link?

惯性请求必须有惯性响应。所以你说你不应该为这个请求使用 Inertia 是正确的。

尝试按照使用 <a></a> 中的答案进行操作,或者发出 Axios 请求。

类似于(不推荐):

 axios.post('/previewPDF',
  { data: this.form },
  { responseType: 'blob' })
  .then(res => {
    let blob = new Blob([res.data], { type: res.headers['content-type'] });
    let link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = item.slice(item.lastIndexOf('/')+1);
    link.click()
  }).catch(err => {})

只需使用传统的表单操作,它就会完整地呈现一个页面,而不仅仅是 Link 惯性。

在表单中,而不是 submit.prevent,使用带有表单输入名称和 ID 的 action=route/link,就像在控制器中一样。我刚做了这个,效果很好。

对不起,如果我解释得不好,我对这个编码世界还是陌生的