黑马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目录下...看到


0 0
原创粉丝点击