get/post请求导出文件及各自的优缺点

一、get请求导出文件

1、window.open(url)

会自动打开一个标签页,下载完后会自动关闭这个标签页。

2、window.location(url) 或 location.href = url

在当前标签页下载。

3、< a href=“url” download=“filename”>点击链接下载< /a>

在当前标签页下载。

总结

优点:代码简单。
缺点:当导出失败时,返回的错误信息会覆盖原来的页面,错误信息可读性差。

二、post请求导出文件

// 以axios为例
axios({
     
    url,
    method: 'post',
    responseType: 'blob',
    params
  })
    .then(async (res) => {
     
      const {
     
      data, 
      status, 
      statusMsg, 
      headers: {
     'content-type': contentType}
      } = res
      if (status === 200) {
     
      	// 导出失败,返回错误信息
      	if (contentType !== 'application/octet-stream') {
     
      		// 将返回的blob格式的返回值,转成对象
      		const responseMessage = JSON.parse(await new Response(responseData).text())
      		const errorMsg = responseMessage.msg || statusMsg
      		// 给出导出错误提示
      		alert(errorMsg)
      	} else {
     
	        const blob = new Blob([data])
	        // 非IE下载
	        if ('download' in document.createElement('a')) {
     
	          const elink = document.createElement('a')
	          elink.download = 'fileName.xlsx'
	          elink.style.display = 'none'
	          elink.href = URL.createObjectURL(blob)
	          document.body.appendChild(elink)
	          elink.click()
	          // 释放 通过调用 URL.createObjectURL() 创建的 URL 对象
	          URL.revokeObjectURL(elink.href)
	          document.body.removeChild(elink)
	        } else {
     
	          // IE10+
	          navigator.msSaveBlob(blob, fileName)
	        }
      	}
      } else {
     
      	alert(statusMsg)
      }
    })
    .catch((err) => {
     // 处理错误})
总结

优点:当导出失败时,可以以一种更优雅的方式展示错误提示信息。
缺点:代码复杂。

你可能感兴趣的:(js,javascript,vue.js,html,前端,es6)