java文件上传工具类

/**
 * 文件工具类
 */
public class FileTools {

    /**
     * 文件上传配置
     * @param req
     * @param filePath
     * @return
     */
    public static Map<String,Object> uploadConfiguration(HttpServletRequest req,String filePath){
        Map<String,Object> map = new HashMap<>();

        String savePath = req.getServletContext().getRealPath("/" + filePath);  // 获取文件保存路径
        String temporaryPath = req.getServletContext().getRealPath("/temp");    // 获取临时文件保存路径
        File temporaryFile = new File(temporaryPath);               // 创建临时文件夹

        if(!temporaryFile.exists() && temporaryFile.isDirectory()){
            temporaryFile.mkdir();      // 生成单极目录
        }

        // 创建一个工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024*1024);     // 设置上传文件最大值
        factory.setRepository(temporaryFile);       // 设置临时上传路径

        // 创建一个文件上传解析器
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("utf-8");

        // 监听文件上传速度
        upload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long l, long l1, int i) {
                System.out.println("文件的大小为:" + l1/1024 + "kb;已上传:" + l/1024 + "kb");
            }
        });

        // 判断提交的数据是否是多部分表单
        if(!ServletFileUpload.isMultipartContent(req)){
            return null;
        }

        upload.setFileSizeMax(1024*1024*5);     // 设置单个文件的大小
        upload.setSizeMax(1024*1024*40);        // 设置文件总量的大小

        // 封装返回的数据
        map.put("savePath",savePath);           // 保存文件夹的父目录
        map.put("servletFileUpload",upload);    // 保存解析器

        return map;
    }

    /**
     * 保存文件
     * @param fileItem
     * @param savePath
     * @return
     */
    public static String saveFile(FileItem fileItem,String savePath){

        try {
            // 获得上传文件的名称(原始文件名称)
            String fileName = fileItem.getName();
            if(fileName==null||fileName.trim().equals("")){
                return null;
            }
            fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);      // 截取文件名称,只保留文件名和后缀名
            String saveFileName = FileTools.createFileName(fileName);               // 获得文件保存的名称
            
            String realSavePath = FileTools.createPath(saveFileName,savePath);      // 获得文件保存的目录

            InputStream inputStream = fileItem.getInputStream();                    // 获得文件的输入流
            // 创建一个文件输出流
            FileOutputStream outputStream = new FileOutputStream(realSavePath + "\\" + saveFileName);

            //创建一个缓冲区
            byte buffer[] = new byte[1024];
            int len = 0;
            while((len = inputStream.read(buffer))>0){
                outputStream.write(buffer,0,len);
            }
            //关闭流对象
            inputStream.close();
            outputStream.close();

            // 删除临时对象
            fileItem.delete();

            // 保存到数据库的文件路径字符串
            String imgPic = realSavePath.substring(realSavePath.indexOf("upload")) + "\\" + saveFileName;
            return imgPic;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 生成随机的不重复的文件名
     * @param fileName 上传文件的文件名
     * @return
     */
    private static String createFileName(String fileName){
        return UUID.randomUUID().toString() + "-" + fileName;
    }

    /**
     * 为防止目录下文件数目太多
     * @param fileName 文件名
     * @param savePath 文件存储路径
     * @return
     */
    private static String createPath(String fileName,String savePath){
        // 得到文件名的hashcode值(字符串在内存中对应的地址)
        int hashcode = fileName.hashCode();

        //生成子文件夹名称
        int dir1 = hashcode & 0xf;          //0~15
        int dir2 = (hashcode & 0x0) >> 4;   //0~15

        //构建新目录(在当前目录下创建子目录)
        String dir = savePath + "\\" + dir1 + "\\" + dir2;
        File file = new File(dir);

        if(!file.exists()){     // 判断文件是否存在
            //创建目录
            if(file.mkdirs()){
                return dir;
            }
        }
        return null;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值