如何使用 axios 下载文件时收到错误

问题描述 投票:0回答:1

我的代码:

休息客户:

return axios.get(url, {
    responseType: 'arraybuffer'
});

处理回复:

  const link = document.createElement('a');
            link.href = window.URL.createObjectURL(new Blob([response.data]));
            link.target = "_blank"; 
            link.click();

如果服务器端没有错误,则运行良好。 但是,当服务器 API 出现错误时,我不会得到任何详细信息,因为响应类型为

arraybuffer

    .catch((error) => {
        dispatch(showError("An Error Occured", error)); //error does not contain the expected details
    });

我尝试不设置 arraybuffer 类型,而是使用 TextDecoder,但是结果 pdf 似乎已损坏(空显示)。

如何修改现有设置以便能够在发生错误时接收详细信息?

编辑:解决方案: 好的,我明白了,我可以从 error.data 中解码出错误信息:

var data:any = JSON.parse(new TextDecoder().decode(error.data));

然后使用错误代码和消息。

javascript reactjs rest axios
1个回答
0
投票

我知道这是一个老问题,但在寻找使用 laravel-snappy 包从基于 Laravel 的 api 端点在 Vue 中下载 pdf 文件的解决方案时发现了它。也许它会对某人有所帮助:

这是我在 api ednpoint 中的代码,用于下载具有特定名称的文件:

$pdf = App::make('snappy.pdf.wrapper');
    $data = Blade::render($template->content, compact('contract'));
    $pdf->loadHTML($data)
        ->setOption('encoding', 'utf-8')
        ->setOption('margin-top', 20)
        ->setOption('margin-right', 20)
        ->setOption('margin-bottom', 20)
        ->setOption('margin-left', 20);
    return $pdf->download('document_' . sha1(time()) . '.pdf');

如果出现问题,请返回一些消息:

return response()->json([
                'message' => 'Can't generate contract......'
            ], Response::HTTP_BAD_REQUEST);

一切似乎都很好,但问题是在 axios 中获取文件名和 400 错误,因为 responseType: 'arraybuffer' 或 'blob' 不是标准的 json 响应,所以这是我基于 Vue 或 JS 的解决方案:

            axios.get(endpoint,{responseType: 'arraybuffer'})
            .then(response => {
                //Get filename from response headers
                let contentDisposition = response.headers["content-disposition"];
                let fileName = contentDisposition.split("filename=")[1];
                //Download file
                let blob = new Blob([response.data], { type: 'application/pdf' })
                let link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
            })
            .catch((error) => {
                //Handle error for responseType: 'arraybuffer'
                if (error instanceof AxiosError && error.response) {
                    let message = JSON.parse(new TextDecoder().decode(error.response.data)).message;
                    this.makeToast(message, "danger");
                }
            })
© www.soinside.com 2019 - 2024. All rights reserved.