【问题标题】:Is There Any Way to Download a File (PDF) in the Controller After Inertia.js Post?Inertia.js 发布后,有什么方法可以在控制器中下载文件(PDF)?
【发布时间】:2021-05-10 23:53:08
【问题描述】:

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

我发布表单的数据:

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

然后在我的控制器中选择所需的数据并生成 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");
   }

由于我使用 Inertia 发布了数据,因此我的响应以如下模式显示:

对此的一般想法似乎是不使用 Inertia 进行文件下载:Laravel & inertia.js file download

在使用 Inertia 的同时有什么方法可以做到这一点?如果没有,是否有适当的方法来处理此张贴我的所有表单数据而不仅仅是<a> 链接?

【问题讨论】:

    标签: laravel vue.js inertiajs


    【解决方案1】:

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

    尝试按照post you linked 中的答案使用<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 => {})
    

    【讨论】:

    • @Andrew 你能用你想出的解决方案更新你的主要帖子吗?
    【解决方案2】:

    只需使用传统的表单动作,它就会完全呈现一个页面,而不仅仅是链接到惯性。

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

    对不起,如果我不能很好地解释这一点,我还是这个编码世界的新手

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多