首页>代码>javabean+servlet+jsp开发商品后台管理系统(源码+数据库脚本)>/JavaWebProject_v1.0/src/com/yueqian/project/common/ImageTools.java
package com.yueqian.project.common;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @ClassName: ImageTools
 * @Description:图片操作工具类
 * @author: 冯老师   QQ:2506075234
 * @date: 2021年3月22日 下午9:01:34
 *
 * @Copyright: 2021 www.gec-edu.org Inc. All rights reserved.
 *
 */
public class ImageTools {

    /**
     * 生成随机的不可重复的文件名
     * @Method: makeFileName
     * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
     * @param filename 文件的原始名称
     * @return uuid+"_"+文件的原始名称
     */
    public static String makeFileName(String filename) { // 2.jpg
        // 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
        return UUID.randomUUID().toString() + "_" + filename;
    }

    /**
     * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
     *
     * @Method: makePath
     * @Description:
     * @param filename 文件名,要根据文件名生成存储目录
     * @param savePath 文件存储路径
     * @return 新的存储目录
     */
    public static String makePath(String filename, String savePath) {
        // 得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
        int hashcode = filename.hashCode();
        int dir1 = hashcode & 0xf; // 0--15
        int dir2 = (hashcode & 0xf0) >> 4; // 0-15
        // 构造新的保存目录
        String dir = savePath + "\\" + dir1 + "\\" + dir2; // upload\2\3
        // upload\3\5
        // File既可以代表文件也可以代表目录
        File file = new File(dir);
        // 如果目录不存在
        if (!file.exists()) {
            // 创建目录
            file.mkdirs();
        }
        return dir;
    }

    /**
     * 上传配置
     * @return
     */
    public static Map<String,Object> uploadConfig(HttpServletRequest req, String filePath) {
        Map<String,Object> map = new HashMap<>();
        //得到上传文件的目录,将上传文件保存在tomcat/webapps/工程/WEB-INF/upload
        //放在WEB-INF/中文件,不能够直接访问,只能通过程序访问,确保了文件的安全
        String savePath = req.getServletContext().getRealPath("/"+filePath);//服务器保存图片的路径
        System.out.println("-------保存图片的路径:" + savePath);
        //上传时生成的临时文件保存目录
        String tempPath = req.getServletContext().getRealPath("/temp");
        //创建临时文件夹
        File tmpFile = new File(tempPath);
        //判断上传文件的保存目录是否存在
        if (!tmpFile.exists() && !tmpFile.isDirectory()) {
            //创建目录
            tmpFile.mkdir();//单极目录
            //tmpFile.mkdirs();//多级目录
        }
        //使用Apache文件上传组件处理文件的上传步骤
        //1、创建一个DiskFileItemFactory工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2、设置工厂缓冲区的大小,当上传文件的大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录中
        factory.setSizeThreshold(1024 * 1024);//1M,如果不指定,默认大小10k
        //3、设置上传的临时目录
        factory.setRepository(tmpFile);
        //4、创建一个上传解析器,专门用来处理文件的伤处(内部是流的封装)
        ServletFileUpload upload = new ServletFileUpload(factory);
        //5、解决上传时后乱码的问题(文件名中文乱码问题)
        upload.setHeaderEncoding("utf-8");
        //6、监听文件上传的进度
        upload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long l, long l1, int i) {
                System.out.println("-----------文件大小为:" + l1 / 1024 + "kb,当前已上传:" + l / 1024 + "kb");
            }
        });
        //7、判断提交上来的数据是否是多部分表单数据(multipart/form-data)
        if (!ServletFileUpload.isMultipartContent(req)) {
            return null;
        }
        //8、设置单个文件上传的文件大小(目前设置为1024*1024*4字节=4M),
        upload.setFileSizeMax(1024 * 1024 * 4);
        //9、设置上传文件总量的大小
        upload.setSizeMax(1024 * 1024 * 40);

        //封装要返回的数据
        map.put("savePath",savePath);//保存文件的外层文件夹
        map.put("servletFileUpload",upload);//保存servletFileUpload
        return map;
    }

    /**
     * 保存文件
     * @param fileItem
     * @param savePath
     * @return
     * @throws IOException
     */
    public static String saveFile(FileItem fileItem,String savePath) {
        try {
            //得到上传文件的名称(原始文件的名称)
            String fileName = fileItem.getName();
            if(fileName==null || fileName.trim().equals("")){
                System.out.println("文件名不能为空!");
                return null;
            }
            //截取名称,只保留文件名和后缀名,如:aa.png
            fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
            //获取文件的输入流
            InputStream in = fileItem.getInputStream();
            //得到文件保存的名称(这个主要是为防止前端提交的文件名一致,导致冲突)
            String saveFileName = ImageTools.makeFileName(fileName);
            //得到文件的保存目录
            String realSavePath = ImageTools.makePath(saveFileName,savePath);
            //创建一个文件输出流
            FileOutputStream out = new FileOutputStream(realSavePath+"\\"+saveFileName);
            //创建一个缓冲区
            byte buffer[] = new byte[1024];
            //判读数据是否读完
            int len = 0;
            //循环写数据
            while ((len=in.read(buffer))>0){
                //写数据
                out.write(buffer,0,len);
            }
            //关闭流
            in.close();
            out.close();
            //删除临时文件
            fileItem.delete();
            //要保存到数据库的文件的具体的路径   D:/a/b/servletDemo/upload/1/2/5/xxxxx.png
            String imgPic = realSavePath.substring(realSavePath.indexOf("upload"))+"\\"+saveFileName;
            return imgPic;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
最近下载更多
穿山甲1001  LV6 9月7日
TY0165  LV20 6月18日
aholian  LV2 6月13日
HangEcho  LV2 6月5日
sz1111111  LV2 3月26日
PSSDZH  LV3 1月22日
aaasue  LV1 1月4日
luoqingyun  LV1 2023年12月31日
玛莎纪  LV1 2023年12月26日
lanana  LV1 2023年12月22日
最近浏览更多
111p1238 11月11日
暂无贡献等级
oolong7 6月30日
暂无贡献等级
ma406805131  LV15 6月29日
3038169233  LV1 6月29日
cong58cong  LV8 6月26日
liyan54188  LV2 6月25日
TY0165  LV20 6月18日
000000111111 6月18日
暂无贡献等级
暂无贡献等级
李朝磊  LV18 6月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友