2048
登录
没  有  难  学  的  前  端
登 录
×
<返回上一级

antd pro 下的文件下载

前端开发作者:Quasimodo

概要

前端上传文件的例子很多, 但是下载相关的例子不多, 主要是因为下载本身比较简单.

但是这次做了个文件导出功能, 接收文件流的时候弄了很长时间也没有成功, 就因为请求中缺了个配置…

示例

后端

后端比较简单, 不管有多少需要计算的业务, 最终只是返回文件流.

下面的示例是通过 golang gin 框架实现的.

package main
 
import (
"strconv"
 
"github.com/gin-gonic/gin"
 )
  
 func main() {
  route(8000)
  }
  
  func route(port int) error {
 
   r := gin.Default()
   apiV1 := r.Group("/api/v1")
  
   // file download
   apiV1.GET("/download/:fileName", DownloadFile)
  
   return r.Run(":" + strconv.Itoa(port))
  }
  
  func DownloadFile(c *gin.Context) {
   fileName := c.Param("fileName")
  
   c.File("./download/" + fileName)
  }

根据 url 中的文件名, 直接返回 download 文件夹下的某个文件

前端

前端一般有以下几种情况的下载:

直接显示图片

直接将文件流赋给 img 的 src 就行

1  <img src={"http://localhost:8000/api/v1/download/test.png"} width={50} height={60} />

提供下载链接, 点击后下载

1  <a href={"http://localhost:8000/api/v1/download/test.pdf"} />

文件导出, 前端没有显示下载链接的位置

这种方式需要前端模拟一个 a 标签的点击, 从而实现文件的下载.

  export async function exportFile(params) {
    return postJson('/api/v1/download/test.xlsx, params, 'blob').then((res) => {
      let url = URL.createObjectURL(new Blob([res]));
      let filename = '导出记录.xlsx';
      let a = document.createElement('a');
      a.href = url;
      a.download = filename;
      a.click();
      URL.revokeObjectURL(url);
    });
  }
  
  const postJson = async (url, params, responseType = '') {
    const response = await request(url, {
      method: 'POST',
      header: {
        'Content-Type': 'application/json',
      },
      data: params,
      responseType: responseType,
    });
  
    // 省略... (对response的一些处理)
  
    return Promise.resolve(response);
  }

这里有个关键的配置 responseType: 'blob' 这个配置不在 header 中,
和 header, data 是平级的. (当时就是这个配置导致导出功能卡了半天, 如果没有这个配置, 导出之后会显示文件已经损坏)

本文来源于网络:查看 >
« 上一篇:前端从入门到放弃--Day1
» 下一篇:CSS响应式布局学习笔记(多种方法解决响应式问题)
评论
点击刷新
评论
相关博文
×添加代码片段