如何使用NextJs ApiRouter跨域下载图片

如何使用NextJs ApiRouter跨域下载图片

有需求要前端导出表格,表格内插入图片,需要将外部链接的图片下载,但是使用axios get方式报了跨域错误,于是想通过转发来解决跨域问题

文件目录
文件目录
imgBuffer.ts

// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import axios from 'axios'
import type { NextApiRequest, NextApiResponse } from 'next'

type Data = any

export default function handler(
  req: NextApiRequest,
  res: NextApiResponse<Data>
) {
  if(req.method === 'POST') {
    const {filePath} = req.body
    axios(filePath, {
      method: 'get',
      responseType: "stream"
      // responseType: 'blob'
    }).then(r => {
      const {data} = r
      res.setHeader('Content-Type', 'image/*')
      data.pipe(res)
    }).catch(e => {
      res.status(200).send({
        code: '000000',
        msg: "文件下载错误"
      })
    })
    return
  }
  res.status(403).send({
    code: '000000',
    msg: "文件下载错误"
  })
}

request.ts

export const getFilesRequest = (path: string) => {
  return request(`/imgBuffer`, {
    method: 'POST',
    responseType: 'blob',
    data: {
      filePath: encodeURI(path)
    },
    hideMessage: true
  }) as any
}

其中request方法只是axios的封装,可以直接换成axios

使用方式

getFilesRequest(file?.url || file).then((res: any) => {
                const blob = res
                const url = URL.createObjectURL(blob)
                const a = document.createElement('a')
                document.body.appendChild(a)
                a.download = ''
                a.href = url
                a.click()
                document.body.removeChild(a)
              })
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值