(二十五)、文件上传
1.首先创建一个empty项目
2.配置project项目中的JDK
3.设置模板
4.添加web外部支持
5.基本思路
1.准备工作
下载两个jar包:
apache commons FileUpload
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
apache commons io
<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
创建一个lib目录,然后把下载后的两个jar包放入到lib目录下,然后右键
点击 Add as library
点开项目结构,发现我们手动导入的lib目录不存在,所以要解决为问题
解决问题的存在
2.实用类介绍
文件上传的注意事项:
1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如
WEB-INF目录下
2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(时间戳,uuid md5)
3.要限制上传文件的最大值 (比如朋友圈上传的视频,限制文件)
4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
需要用到的类详解:
ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,通过servletFileUpload对象的构造方法或setFileltemFactory()方法设置ServletFileUpload对象的FileitemFactory属性
3.思维导图:
4.正戏开始
(1).表单如果包含一个文件上传输入项的化,这个表单的enctype属性就必须设置为multipart/form-data (2).在html页面input中必须有一个<input type="file" name="filename"> (3). get: 上传文件大小限制 post: 上传文件大无限制
1.创建文件目录
//* 判断文件上传的是普通表单还是带文件的表单, if(ServletFileUpload.isMultipartContent(req)){ return;//如果是普通表带那就进入直接返回,否则就不运行 }try { //创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片 String realPath = this.getServletContext().getRealPath("/WEB-INF/upload"); // 创建一个文件目录 File file = new File(realPath); // 假如说文件目录不存在情况下,我们就创建 if(!file.exists()){ file.mkdir(); //创建这个目录 }
2.创建临时文件目录
//* 缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久 String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload"); // 创建一个文件目录 File tempFile = new File(tempRealPath); // 假如说文件目录不存在情况下,我们就创建 if(!tempFile.exists()){ tempFile.mkdir(); //创建这个临时目录 }
3.设置工厂
//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦 // 但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件 // ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); // 2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去 diskFileItemFactory.setSizeThreshold(1024*1024); //缓存大小为1MB // 3. diskFileItemFactory.setRepository(tempFile); //临时目录的保存目录,需要一个file
4.获取servletFileUpload
// ******************* 4.获取servletFileUpload ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); // 5.监听文件上传的速度 servletFileUpload.setProgressListener(new ProgressListener() { public void update(long l, long l1, int i) { System.out.println("总大小"+l1+"已上传:"+l); } }); // 处理乱码问题 servletFileUpload.setHeaderEncoding("UTF-8"); // 设置单个文件的最大值 // 1024=1kb*1024=1MB*10=10MB servletFileUpload.setSizeMax(1024*1024*10);
implements sericlizable : 标记接口,JVM----》本地方法栈 native -->C++