后台接口返回void有设置response相关内容,前端通过open打开接口下载excel文件

1、引入依赖,用来生成excel

复制代码
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.2</version>
        </dependency>

2、接口类代码如下:

复制代码
/**
     * 企业列表--导出
     */
    @ApiOperation("企业列表--导出")
    @GetMapping(value = "/downloadTenantList")
    public void downloadTenantList(HttpServletRequest request,
                                                                  HttpServletResponse response) throws IOException {
        log.info("downloadTenantList begin.");
        String tenantIds = request.getParameter("tenantIds");
        Map<String,String> map = tenantService.exportTenantListByIds(tenantIds);
        String filePath = map.get("filePath");
        String fileName = map.get("fileName");
        InputStream is = new FileInputStream(new File(filePath));
        // 设置response参数,可以打开下载页面
        response.reset();
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setHeader("Access-Control-Expose-Headers", "content-disposition");
        response.setHeader("Content-Disposition", "attachment;filename="+fileName);
        ServletOutputStream out = response.getOutputStream();
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(out);
            byte[] buff = new byte[2048];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);
            }
            log.info("downloadTenantList end.");
        } catch (final IOException e) {
            log.error("downloadTenantList errors, reason:{}", e.getMessage());
        } finally {
            if (bis != null){
                bis.close();
            }
            if (is != null){
                is.close();
            }
            if (bos != null){
                bos.close();
            }
            if (out != null){
                out.close();
            }
        }
        // 用后删除临时用途的文件
        File fileTempZip = new File(filePath);
        if(fileTempZip.exists()){
            fileTempZip.delete();
        }
    }

3、服务层代码如下:

复制代码
public Map<String,String> exportTenantListByIds(String ids) {
        String[] idStrs = ids.split(",");
        List<TenantMaintainDTO> list = tenantMapper.listTenantsByIds(Arrays.asList(idStrs));
        List<TenantInfoExcelDTO> listExport = new ArrayList<>();
        if(list!=null && !list.isEmpty()) {
            // 处理企业相关信息,管理员、人数、企业行业、企业类型、企业规模
            handleTenantRelatedInfo(list);
            listExport = handleTenantListForExport(list);
        }

        String fileName = UuidUtil.getUuid() + ".xlsx";
        String filePath = filePathTemp + fileName;
        EasyExcel.write(filePath, TenantInfoExcelDTO.class)
                .sheet("企业列表")
                .doWrite(listExport);
        Map<String,String> map = new HashMap<String,String>();
        map.put("fileName",fileName);
        map.put("filePath",filePath);
        return map;
    }

4、TenantInfoExcelDTO类代码如下:

复制代码
package cn.iiot.myth.platform.dto.tenant;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


/**
 * <pre>
 * 企业列表
 * </pre>
 *
 * @author [email protected]
 * @date 2024-05-06
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class TenantInfoExcelDTO {

    @ExcelProperty(value = "编号")
    private String tenantId;

    @ExcelProperty(value = "企业/组织机构名称")
    private String companyName;

    @ExcelProperty(value = "所属行业")
    private String companyIndustry;

    @ExcelProperty(value = "规模")
    private String companyScale;

    @ExcelProperty(value = "联系人")
    private String contacts;

    @ExcelProperty(value = "管理员")
    private String managerNames;

    @ExcelProperty(value = "平台成员数量")
    private int userCount;

    @ExcelProperty(value = "联系号码")
    private String mobile;

    @ExcelProperty(value = "联系邮箱")
    private String email;

    @ExcelProperty(value = "认证状态")
    private String auditStatus;

    @ExcelProperty(value = "入驻时间")
    private Date createTime;

    @ExcelProperty(value = "认证时间")
    private Date joinDate;
}

5、前端使用window.open("接口路径");下载该excel文件。

功能正常使用,但是这种方式,前端加不了认证头信息,该后台接口不安全。

解决方案参考:后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件-CSDN博客

相关推荐
10年前端老司机1 小时前
什么!纯前端也能识别图片中的文案、还支持100多个国家的语言
前端·javascript·vue.js
摸鱼仙人~1 小时前
React 性能优化实战指南:从理论到实践的完整攻略
前端·react.js·性能优化
程序员阿超的博客2 小时前
React动态渲染:如何用map循环渲染一个列表(List)
前端·react.js·前端框架
magic 2452 小时前
模拟 AJAX 提交 form 表单及请求头设置详解
前端·javascript·ajax
小小小小宇7 小时前
前端 Service Worker
前端
只喜欢赚钱的棉花没有糖8 小时前
http的缓存问题
前端·javascript·http
小小小小宇8 小时前
请求竞态问题统一封装
前端
loriloy8 小时前
前端资源帖
前端
源码超级联盟8 小时前
display的block和inline-block有什么区别
前端
GISer_Jing8 小时前
前端构建工具(Webpack\Vite\esbuild\Rspack)拆包能力深度解析
前端·webpack·node.js