黑马day15 文件上传&apche的工具包
来源:互联网 发布:mac appstore 打不开 编辑:程序博客网 时间:2024/06/05 14:21
1.肯定要导入apche的jar包
2.要使用的类的介绍..
2.1DiskFileItemFactory
public DiskFileItemFactory(int sizeThreshold, java.io.File repository)
public DiskFileItemFactory()
public void setSizeThreshold(int sizeThreshold) --用来设定内存缓冲区的大小,默认是10k
public void setRepository(java.io.File repository) --设定临时文件夹的大小
2.2ServletFileUpload
boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request) 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
setFileSizeMax(long fileSizeMax) 设置单个上传文件的最大值
setSizeMax(long sizeMax) 设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding) 设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener) 实时监听文件上传状态
2.3FileItem
boolean isFormField() 判断FileItem是一个文件上传对象还是普通表单对象
如果是一个普通字段项可以调用:
String getFieldName() 获得普通表单对象的name属性
String getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置
如果是一个文件上传项:
String getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream() 获得上传文件的输入流
delete() 在关闭FileItem输入流后,删除临时文件
文件存放应该注意的问题:
1.upload文件夹和temp文件夹都要放在web-inf目录下保护起来,防止上传入侵和访问其他用户上传资源的问题
2.文件名要拼接uuid保证唯一
3.文件要分目录存储保证同一目录下不要有过多的文件,分目录的算法有很多,介绍了一种根据hash值分目录算法
案例:
1.写一个文件上传的jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title><meta http-equiv=" pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> </head> <body style="text-align: center"> <h1>文件上传</h1> <div align="center"> <form action="${pageContext.request.contextPath }/servlet/UploadServlet1" enctype="multipart/form-data" method="post"> 描述信息1:<input type="text" name="description1"/><br> 描述信息2:<input type="text" name="description2"/><br> <input type="file" name="file1"/><br> <input type="submit" value="提交"/><br> </form> </div> </body></html>2.要实现文件上传的servlet类(需要在WEB-INF的目录下建立upload和temp文件夹)
package cn.itheima.upload;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import cn.itheima.utils.IOUtils;public class UploadServlet1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// 1.获取文件上传的工厂类DiskFileItemFactory factory = new DiskFileItemFactory();factory.setSizeThreshold(1024 * 100);// 设置内存的缓存,如果缓存满了就放到临时文件夹中factory.setRepository(new File(this.getServletContext().getRealPath("WEB-INF/temp")));// 设置临时文件夹// 2.通过工厂类得到文件上传的核心类ServletFileUpload fileUpload = new ServletFileUpload(factory);fileUpload.setFileSizeMax(1024 * 1024 * 100);// 设置单个上传文件的大小fileUpload.setSizeMax(1024 * 1024 * 300);// 设置文件的总的大小fileUpload.setHeaderEncoding("utf-8");// 解决上传文件中文名的乱码问题// 3.检查提交的表单enctype类型if (!fileUpload.isMultipartContent(request)) {throw new RuntimeException("请使用正确的表单类型上传文件");}// --解析requestList<FileItem> list = fileUpload.parseRequest(request);// --遍历listfor (FileItem item : list) {if (item.isFormField()) {// 是普通输入类型String fieldName = item.getFieldName();String value = item.getString("utf-8");// 解决普通输入类型的中文乱码问题System.out.println(fieldName + ":" + value);} else {// 文件上传类型String filename = item.getName();// 上传文件的文件名String uuid = UUID.randomUUID().toString();String uuidname = uuid + "_" + filename;// 上传文件使用uuid之后的文件名String str = Integer.toHexString(uuidname.hashCode());// 这里使用hashcode// 进行文件夹的创建String path = this.getServletContext().getRealPath("WEB-INF/upload");for (char c : str.toCharArray()) {path += "/" + c;}new File(path).mkdirs();// 创建文件夹InputStream in = item.getInputStream();OutputStream out = new FileOutputStream(new File(path,uuidname));IOUtils.In2Out(in, out);IOUtils.closeIO(in, out);item.delete();// 删除临时文件夹}}} catch (Exception e) {e.printStackTrace();throw new RuntimeException();}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
3.工具类
package cn.itheima.utils;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class IOUtils {private IOUtils(){}/** * 读取流中的数据写到输出流中 * @param in * @param out * @throws IOException */public static void In2Out(InputStream in,OutputStream out) throws IOException{int len=0;byte b[]=new byte[1024];while((len=in.read(b))!=-1){out.write(b, 0, len);}}/** * 关闭资源 * @param in * @param out */public static void closeIO(InputStream in,OutputStream out){if(in!=null){try {in.close();} catch (IOException e) {e.printStackTrace();}finally{in=null;}}if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}finally{out=null;}}}}
运行界面:
当运行完毕后可以在tomcat的WEB-INF的upload目录下...看到
- 黑马day15 文件上传&apche的工具包
- 黑马day15 文件上传入门
- 黑马day15 文件下载
- 文件上传工具包
- 使用apche.commons.fileupload进行文件上传时的工具类解说
- 黑马day15 仿网盘案例
- 黑马程序员-day15-泛型
- 使用apche的fileupload实现ckeditor的上传功能
- 黑马程序员_向对象的核心思想+实例Day15
- Putty工具包PSCP向Linux上传文件
- 黑马程序员:BeanUtils工具包、资源关闭及资源文件存放的几种方式介绍
- 黑马程序员_java基础day15
- 黑马程序员-Java API-day15
- 黑马程序员-day15集合框架
- iOS study Day15-自定义文件的解档和归档
- 黑马小日子--文件上传
- apche虚拟主机的配置
- apche限制文件目录访问
- 小胖说事26------cocoaPods安装以及问题:Setting up CocoaPods master repo
- Java中的String的replace方法和replaceAll方法
- Word Ladder
- iOS开发笔记--高端Thread用法
- Struts2(1)
- 黑马day15 文件上传&apche的工具包
- Linux开发中常见段错误问题原因分析
- (or type control -D to continue)
- [php]对服务器进行一致性hash分布算法
- TOJ 4107 A simple problem
- unity-metaio在xcode的导出编译出错
- Unicode字符集下CString与char *转换
- tar命令解压时如何去除目录结构及其解压到指定目录
- GPIO口中断例程_MK20DX128VLH5_K20系列