FTP服务器:FTP、共享和本地三种情况下实现图片压缩后上传下载(四)

       在网站的开发中,经常会使用到上传和下载图片的功能,可是有时候由于图片过大,或者所需下载的图片过多,为减少下载时间,提高下载速度,很多人都会想到通过压缩的方式进行上传或下载图片,最近刚好有一个项目使用了此功能,需要在FTP、共享和本地三种情况下实现图片压缩后上传下载,特在此对需要在代码进行分享记录,话不多说,直接上核心干货。

1、网页上下载图片压缩包

核心:

1)根据指定图片或图片路径获取到图片数据流

2)把图片流下载到临时文件中,并对其进行压缩

3)完成后删除临时文件,返回压缩包

4)删除压缩包

所需jar:

commons-compress-1.6.jar

核心处理代码如下:

public void zipImg(ZipArchiveOutputStream zaos,String pathtemp,byte[] data,String name) throws Exception{
        if(data != null){ 
            String nameTemp = name+"_"+new Date().getTime();
            File imageFileTemp = new File(pathtemp+File.separator+nameTemp+".jpg"); 
            //创建输出流 
            FileOutputStream outStream = new FileOutputStream(imageFileTemp); 
            //写入数据 
            outStream.write(data); 
            //关闭输出流 
            outStream.close(); 
            
            //获取创建好的图片文件 
            File imageFile = new File(pathtemp+"/"+nameTemp+".jpg"); 
            ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(imageFile,imageFile.getName());
            zaos.putArchiveEntry(zipArchiveEntry);
            zaos.write(data);
            zaos.closeArchiveEntry(); 
            // 压缩完删除txt文件 
            if (imageFile.exists()) { 
                imageFile.delete(); 
            } 
        }
    }
        //定义根路径 
        String rootPath = request.getSession().getServletContext().getRealPath("/");
        String pathtemp = rootPath + "temp_download";
        File file = new File(pathtemp); //创建临时目录
        if(!file.exists()){ //判断文件是否存在,如果不存在,则创建此文件夹 
           file.mkdir(); 
        } 
        String zipFileName = title+"行李图片压缩包_"+creatDate + ".zip"; 
        File zipFile = new File(pathtemp + "/" + zipFileName); 
        ZipArchiveOutputStream zaos = null;
        try {
            zaos = new ZipArchiveOutputStream(zipFile);
            zaos.setUseZip64(Zip64Mode.AsNeeded);
            
            PropertiesConfig prop = new PropertiesConfig("general.properties");
            String mode = prop.getPropertieString("mode");
            if(mode.equals("Local")){//本地
                for(int i = 0 ;i<paths.size();i++){
                    try{
                        //调用工具类获取图片
                        byte[] data = ImageUtil.image2byte(paths.get(i));
                        zipImg(zaos,pathtemp,data,nameList.get(i));
                    }catch(Exception e){
                        System.out.println(e.getMessage());
                    }
                }
                zaos.finish();
            }else if(mode.equals("CIFS")){//共享文件
                for(int i = 0 ;i<paths.size();i++){
                    try{
                        //调用工具类获取图片
                        byte[] data = SMBUtils.GetSMB().DownloadRemoteFile(paths.get(i));
                        zipImg(zaos,pathtemp,data,nameList.get(i));
                    }catch(Exception e){
                        System.out.println(e.getMessage());
                    }
                }
                zaos.finish();
            }else if(mode.equals("FTP")){//FTP
                for(int i = 0 ;i<paths.size();i++){
                    try{
                        //调用工具类获取图片
                        byte[] data = FtpUtils.GetFTPClient().download(paths.get(i));
                        zipImg(zaos,pathtemp,data,nameList.get(i));
                    }catch(Exception e){
                        System.out.println(e.getMessage());
                    }
                }
                zaos.finish();
            }
            file.delete();//删除临时目录
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(zaos != null) {
                    zaos.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        
     // 输出到客户端 
        OutputStream out = null; 
        out = response.getOutputStream(); 
        response.reset(); 
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(zipFileName.getBytes("GB2312"), "ISO-8859-1")); 
        response.setContentType("application/octet-stream; charset=utf-8"); 
        response.setCharacterEncoding("UTF-8"); 
        out.write(FileUtils.readFileToByteArray(zipFile)); 
        out.flush(); 
        out.close(); 
        // 输出客户端结束后,删除压缩包 
        if (zipFile.exists()) { 
            zipFile.delete(); 
        } 

上传的流程与这差不多,就不在此共享了,另附赠一份完整的压缩解压工具类,用于压缩和解压指定目录下的所有文件

package com.ljb.ImageUtil;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 
public class ZipUtil {
    public static void main(String[] args) {
        String dir = "D:\\zip";
        String zippath = "D:\\zip\\test2.zip";
        ZipUtil.zip(dir, zippath);
 
        String unzipdir = "D:\\test2";
//        String unzipdir = "D:\\zip\\img";
//        String unzipfile = "D:\\zip\\test2.zip";
//        ZipUtil.unzip(unzipfile, unzipdir);
//        System.out.println("success!");
    } 
    /**
     * zip压缩文件
     * @param dir
     * @param zippath
     */
    public static void zip(String dir ,String zippath){
        List<String> paths = getFiles(dir); 
        compressFilesZip(paths.toArray(new String[paths.size()]),zippath,dir);
    }
    /**
     * 递归取到当前目录所有文件
     * @param dir
     * @return
     */
    public static List<String> getFiles(String dir){
        List<String> lstFiles = null;       
        if(lstFiles == null){
            lstFiles = new ArrayList<String>();
        }
        File file = new File(dir);
        File [] files = file.listFiles(); 
        for(File f : files){
            if(f.isDirectory()){
                lstFiles.add(f.getAbsolutePath());
                lstFiles.addAll(getFiles(f.getAbsolutePath()));
            }else{ 
                String str =f.getAbsolutePath();
                lstFiles.add(str);
            }
        }
        return lstFiles;
    }
    
    /**
     * 文件名处理
     * @param dir
     * @param path
     * @return
     */
    public static String getFilePathName(String dir,String path){
        String p = path.replace(dir+File.separator, "");
        p = p.replace("\\", "/");
        return p;
    }
    /**
     * 把文件压缩成zip格式
     * @param files         需要压缩的文件
     * @param zipFilePath 压缩后的zip文件路径   ,如"D:/test/aa.zip";
     */
    public static void compressFilesZip(String[] files,String zipFilePath,String dir) {
        if(files == null || files.length <= 0) {
            return ;
        }
        ZipArchiveOutputStream zaos = null;
        try {
            File zipFile = new File(zipFilePath);
            zaos = new ZipArchiveOutputStream(zipFile);
            zaos.setUseZip64(Zip64Mode.AsNeeded);
            //将每个文件用ZipArchiveEntry封装
            //再用ZipArchiveOutputStream写到压缩文件中
            for(String strfile : files) {
                File file = new File(strfile);
                if(file != null) {
                    String name = getFilePathName(dir,strfile);
                    ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(file,name);
                    zaos.putArchiveEntry(zipArchiveEntry);
                    if(file.isDirectory()){
                        continue;
                    }
                    InputStream is = null;
                    try {
                        is = new BufferedInputStream(new FileInputStream(file));
                        byte[] buffer = new byte[1024 ]; 
                        int len = -1;
                        while((len = is.read(buffer)) != -1) {
                            //把缓冲区的字节写入到ZipArchiveEntry
                            zaos.write(buffer, 0, len);
                        }
                        zaos.closeArchiveEntry(); 
                    }catch(Exception e) {
                        throw new RuntimeException(e);
                    }finally {
                        if(is != null)
                            is.close();
                    }
                     
                }
            }
            zaos.finish();
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally {
                try {
                    if(zaos != null) {
                        zaos.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
        }
         
    }
    
   
    /**
    * 把zip文件解压到指定的文件夹
    * @param zipFilePath zip文件路径, 如 "D:/test/aa.zip"
    * @param saveFileDir 解压后的文件存放路径, 如"D:/test/" ()
    */
    public static void unzip(String zipFilePath, String saveFileDir) {
        if(!saveFileDir.endsWith("\\") && !saveFileDir.endsWith("/") ){
            saveFileDir += File.separator;
        }
        File dir = new File(saveFileDir);
        if(!dir.exists()){
            dir.mkdirs();
        }
        File file = new File(zipFilePath);
        if (file.exists()) {
            InputStream is = null; 
            ZipArchiveInputStream zais = null;
            try {
                is = new FileInputStream(file);
                zais = new ZipArchiveInputStream(is);
                ArchiveEntry archiveEntry = null;
                while ((archiveEntry = zais.getNextEntry()) != null) { 
                    // 获取文件名
                    String entryFileName = archiveEntry.getName();
                    // 构造解压出来的文件存放路径
                    String entryFilePath = saveFileDir + entryFileName;
                    OutputStream os = null;
                    try {
                        // 把解压出来的文件写到指定路径
                        File entryFile = new File(entryFilePath);
                        if(entryFileName.endsWith("/")){
                            entryFile.mkdirs();
                        }else{
                            os = new BufferedOutputStream(new FileOutputStream(
                                    entryFile));                            
                            byte[] buffer = new byte[1024 ]; 
                            int len = -1; 
                            while((len = zais.read(buffer)) != -1) {
                                os.write(buffer, 0, len); 
                            }
                        }
                    } catch (IOException e) {
                        throw new IOException(e);
                    } finally {
                        if (os != null) {
                            os.flush();
                            os.close();
                        }
                    }
 
                } 
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    if (zais != null) {
                        zais.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值