fetch + streamsaver 进行文件下载

475 阅读1分钟
fetch(url, {
    method: 'get',
    mode: 'cors',
    headers: {
      'Content-type': 'application/octet-stream',
      'token': store.state.token,
      
    },
  })
  .then(res=>{
    console.log(res);
    
    if(res.status === 500) {
      ElMessage.error('文件错误,下载失败')
      return 
    }
    const fileStream = streamSaver.createWriteStream(name,{
      size:Number(res.headers.get('Content-Length'))
    })

    const readableStream = res.body

    if(window.WritableStream && readableStream?.pipeTo){
      return readableStream.pipeTo(fileStream)
      .then(()=>console.log('done writing'))
      
    }
    window.writer = fileStream.getWriter()

    const reader = res.body?.getReader()
    const pump = () => reader?.read()
    .then(res => res.done? window.writer.close() : window.WritableStream.write(res.value).then(pump))

    pump()