Implementación front-end y back-end del paquete comprimido zip de exportación de Java+Vue

Este ejemplo implementa la exportación por lotes de archivos de imagen de código QR y coloca todas las imágenes en un archivo zip.

Pasos de implementación:

1. Ciclo de datos de consulta para generar imágenes de código QR

2. Coloque la imagen del código QR generado en un paquete comprimido y devuélvalo al front-end a través del flujo de datos

  • Al cn.hutool.extra.qrcode.QrCodeUtilgenerar una imagen de código QR, obtengabyte[]
  • Al java.util.zip.ZipOutputStreamescribir byte[]el paquete comprimido
  • devolviendo java.io.ByteArrayOutputStreamel completobyte[]
  • Una vez completadas todas las escrituras, obtenga la byte[]salida completa enHttpServletResponse
  • Establecer HttpServletResponsedatos de encabezado de respuesta, marcados como descarga de archivo

3. El front-end Vue obtiene el flujo de datos para realizar la descarga

  • Llame a la interfaz de back-end, configureresponseType: 'blob'
  • Al window.navigator.msSaveBlobdescargar el archivo

1. La interfaz de back-end genera un byte de archivo comprimido zip []

   /**
     * 导出二维码
     *
     */
    @RequestMapping(value = "/exportQrcode")
    public void exportQrcode(HttpServletRequest request, HttpServletResponse response, ProQrcode proQrcode) throws IOException {
    
    
        // Step.1 组装查询条件
        // ... 此处省略数据查询条件...
		// 查询数据
        List<ProQrcode> list = service.list(queryWrapper);
        int width = 800;
        if (StringUtils.isNotBlank(widthStr)) {
    
    
            width = Integer.parseInt(widthStr);
        }
        byte[] data = genQrcodeImg(list, width);
        zip(response, data);
    }
    /**
     * 批量生产图片zip压缩包数据
     * */
    private byte[] genQrcodeImg(List<ProQrcode> list, int width) {
    
    
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
             ZipOutputStream zip = new ZipOutputStream(outputStream)) {
    
    

            for (int i = 0; i < list.size(); i++) {
    
    
                ProQrcode qrcode = list.get(i);
                try {
    
    
                    // 添加到zip,设置文件名,后缀.png
                    zip.putNextEntry(new ZipEntry(String.format("%d.%s.png", i + 1, qrcode.getCode())));
                    // 查询是否配置了logo,如果有logo,则把logo添加到二维码中
                    BufferedImage logo = CustomerBrandCache.getLogo(qrcode.getCustomerBrandId());
                    QrConfig config = new QrConfig();
                    config.setWidth(width).setHeight(width);
                    if (logo != null) {
    
    
                        config.setImg(logo);
                    }
                    // 生成二维码图片
                    byte[] bytes = QrCodeUtil.generatePng(qrcode.getLinkUrl(), config);
                    // 将byte[]写入到压缩包中
                    IOUtils.write(bytes, zip);
                    zip.flush();
                    zip.closeEntry();
                } catch (IOException e) {
    
    
                    log.error("addQrcode,error:", e);
                }
            }
            return outputStream.toByteArray();
        } catch (Exception e) {
    
    
            log.error("", e);
        }
        return new byte[0];
    }

    /**
     * 生成zip文件,设置响应头为文件下载
     */
    private void zip(HttpServletResponse response, byte[] data) throws IOException {
    
    
        response.reset();
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
        response.setHeader("Content-Disposition", "attachment; filename=\"qrcode.zip\"");
        response.addHeader("Content-Length", "" + data.length);
        response.setContentType("application/octet-stream; charset=UTF-8");
        IOUtils.write(data, response.getOutputStream());
    }

  • Al cn.hutool.extra.qrcode.QrCodeUtilgenerar una imagen de código QR, obtengabyte[]
  • Al java.util.zip.ZipOutputStreamescribir byte[]el paquete comprimido
  • devolviendo java.io.ByteArrayOutputStreamel completobyte[]
  • Una vez completadas todas las escrituras, obtenga la byte[]salida completa enHttpServletResponse
  • Establecer HttpServletResponsedatos de encabezado de respuesta, marcados como descarga de archivo

2. El front-end de Vue llama a la interfaz de back-end para realizar la descarga

/**
 * 导出二维码数据
 */
export const exportQrcode = async (name, params) => {
    
    
  const data = await defHttp.get({
    
     url: Api.exportQrcode, params, responseType: 'blob', timeout: 30000 }, {
    
     isTransformResponse: false })
  if (!data) {
    
    
    createMessage.warning('文件下载失败')
    return
  }
  if (!name || typeof name != 'string') {
    
    
    name = '导出文件'
  }
  const blobOptions = {
    
     type: 'application/octet-stream' }
  const fileSuffix = '.zip'
  debugger
  if (typeof window.navigator.msSaveBlob !== 'undefined') {
    
    
    window.navigator.msSaveBlob(new Blob([data], blobOptions), name + fileSuffix)
  } else {
    
    
    const url = window.URL.createObjectURL(new Blob([data], blobOptions))
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', name + fileSuffix)
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link) //下载完成移除元素
    window.URL.revokeObjectURL(url) //释放掉blob对象
  }
}
  • Llame a la interfaz de back-end, configureresponseType: 'blob'
  • Al window.navigator.msSaveBlobdescargar el archivo

おすすめ

転載: blog.csdn.net/wlddhj/article/details/130398556