首页>代码>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; } }
最近下载更多
最近浏览更多
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日
暂无贡献等级
微信网友_7041475584184320
6月17日
暂无贡献等级
李朝磊 LV18
6月17日