Utilice Java para descargar y comprimir archivos en formato zip

Escrito en el frente : Soy "Navegando hacia el Mar" Este apodo proviene de mi nombre y del nombre de mi novia. Amo la tecnología, el código abierto y la programación. 技术是开源的、知识是共享的.

Este blog es un pequeño resumen y registro de tu propio aprendizaje. Si estás interesado en Java y algoritmos , puedes seguir mi dinámica y aprenderemos juntos.

用知识改变命运,让我们的家人过上更好的生活.

No he escrito un artículo en más de dos meses debido a mi apretada agenda. En el desarrollo reciente, el servidor esclavo se utiliza para descargar archivos al local en forma de paquetes comprimidos. Aquí hay un resumen. Si necesita usarlo, ¡puede usarlo directamente como una herramienta!


1. Descarga de archivos por lotes en formato zip

Pasos :

① Obtenga el flujo de OutputStream a través del objeto de respuesta
② Establezca el tipo de contenido del archivo para determinar el tipo de archivo de descarga
③ Establezca el encabezado del archivo
④ Obtenga el flujo de salida del zip
⑤ Obtenga todas las carpetas y archivos bajo la ruta del archivo
⑥ Obtenga todos los nombres de archivo y directorios en este directorio Nombre
⑦ Leer la colección de la ruta del archivo cíclicamente para obtener la ruta de cada archivo
⑧ Crear un archivo a través de la ruta del archivo
⑨ Escribir cada archivo en el paquete de compresión de archivos zip, es decir, empaquetarlo
⑩ Finalmente actualice el búfer

Código:

/**
 * 以zip形式批量下载文件
 *
 * @param response
 * @param downloadName
 * @param filePath
 */
public static void MultiFileZipDownload(HttpServletResponse response, String downloadName, String filePath) {
    
    
    OutputStream outputStream = null;
    ZipOutputStream zos = null;
    try {
    
    
        // 通过response对象获取OutputStream流
        outputStream = response.getOutputStream();
        // 设置文件ContentType类型
        response.setContentType("multipart/form-data");
        // 设置文件头
        response.setHeader("Content-Disposition", "attachment;fileName = " + URLEncoder.encode(downloadName, "UTF-8"));
        // 获取zip的输出流
        zos = new ZipOutputStream(outputStream);
        // 获取文件路径下的所有文件夹及文件
        File dirFile = new File(filePath);
        // 获取此目录下的所有文件名与目录名
        String[] fileList = dirFile.list();
        // 循环读取文件路径集合,获取每一个文件的路径
        if (fileList != null) {
    
    
            for (String fp : fileList) {
    
    
                File file = new File(filePath, fp);  // 通过文件路径创建文件
                zipFile(file, zos);  // 将每一个文件写入zip文件压缩包内,即进行打包
                // 刷新缓冲区
                response.flushBuffer();
            }
        }
    } catch (Exception e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        try {
    
    
            if (zos != null) {
    
    
                zos.close();
            }
            if (outputStream != null) {
    
    
                outputStream.close();
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

En segundo lugar, el método de comprimir archivos.

Pasos :

① Primero determine si el archivo existe
② Si es un archivo
③ Cree un flujo de entrada para leer el archivo
④ Escriba el archivo en el archivo zip
⑤ Escriba en el archivo
⑥ Finalmente cierre los flujos de entrada y salida
⑦ Si es una carpeta, use agotamiento Método para obtener el archivo y escribirlo en el archivo zip
⑧ Cerrar los flujos de entrada y salida

Código:

/**
 * 压缩文件的方法
 *
 * @param inputFile
 * @param zipoutputStream
 */
public static void zipFile(File inputFile, ZipOutputStream zipoutputStream) {
    
    
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    try {
    
    
        if (inputFile.exists()) {
    
     // 判断文件是否存在
            if (inputFile.isFile()) {
    
      // 如果是文件
                // 创建输入流读取文件
                fis = new FileInputStream(inputFile);
                bis = new BufferedInputStream(fis);
                // 将文件写入zip压缩包内
                ZipEntry zip =
                        new ZipEntry(inputFile.getParentFile().getName() + File.separator + inputFile.getName()); //获取文件名
                zipoutputStream.putNextEntry(zip);
                // 进行写入文件
                byte[] bytes = new byte[1024];
                long fileLength = 0;
                while (fileLength < inputFile.length()) {
    
    
                    int count = bis.read(bytes, 0, 1024);
                    fileLength += count;
                    zipoutputStream.write(bytes, 0, count);
                }
                // 关闭输入输出流
                if (bis != null) {
    
    
                    bis.close();
                }
                if (fis != null) {
    
    
                    fis.close();
                }
            } else {
    
      // 如果是文件夹,则使用穷举的方法获取文件,写入zip
                try {
    
    
                    zipoutputStream.putNextEntry(new ZipEntry(inputFile.getName() + File.separator));
                    File[] files = inputFile.listFiles();
                    for (int i = 0; i < files.length; i++) {
    
    
                        zipFile(files[i], zipoutputStream);
                    }
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    } catch (Exception e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        try {
    
    
            if (bis != null) {
    
    
                bis.close();
            }
            if (fis != null) {
    
    
                fis.close();
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

Si cree que el artículo es un poco útil para usted, busque " 程序猿编程" en WeChat para leerlo por primera vez.

En el camino de mover ladrillos, trabajamos duro juntos y destruimos nuestro futuro con ambas manos.

Inserte la descripción de la imagen aquí


Debido al nivel limitado, este blog inevitablemente tendrá deficiencias. ¡Espero que me puedan dar su consejo!

Supongo que te gusta

Origin blog.csdn.net/weixin_43570367/article/details/107451666
Recomendado
Clasificación