JAVA WEB开发之文件上传相关jar包的学习
2016-03-30 18:24
543 查看
java web开发中 关于文件上传的jar包的总结,
基础知识全是都在源码中总结了 并且做了相关的注释,简单易懂 涉及到了大部分的文件上传知识
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.math.BigDecimal; import java.text.Bidi; 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.FileUpload; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.demo.Utils.IOUtils; public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // request.setCharacterEncoding("utf-8"); // response.setContentType("text/html;charset=utf-8"); // 普通法方获取文件 // InputStream in = request.getInputStream(); // byte[] by = new byte[1024]; // int i = 0; // while ((i = in.read(by)) != -1) { // System.out.write(by, 0, i); // 通过apache jar包获取文件 try { // 1.创建工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小为100k factory.setSizeThreshold(100 * 1024); // 设置零时文件件 factory.setRepository(new File(this.getServletContext() .getRealPath("WEB-INF/tem"))); // 2.生产文件上传核心类 ServletFileUpload fileupload = new ServletFileUpload(factory); // 判断当前表单是否是正确的文件上传表单 if (!fileupload.isMultipartContent(request)) { throw new RuntimeException("请使用正确的表单上传"); } // 设置编码集 解决上传文件名乱码问题 fileupload.setHeaderEncoding("utf-8"); // 设置文件上传监听 fileupload.setProgressListener(new ProgressListener() { // 诺参数为arg0 arg1 arg2类似的 说明没有导入源码 导入即可 // 每当上传一点点数据 都会调用update方法 // 当前文件开始上传的时间 long beginTime = System.currentTimeMillis(); public void update(long pBytesRead, long pContentLength, int pItems) { // TODO Auto-generated method stub // 数据处理 利用bigdecimal类 BigDecimal br = new BigDecimal(pBytesRead).divide( new BigDecimal(1024), 2, BigDecimal.ROUND_HALF_UP); BigDecimal cl = new BigDecimal(pContentLength).divide( new BigDecimal(1024), 2, BigDecimal.ROUND_HALF_UP); System.out.println("当前已经读取:" + br + "KB" + " 在总大小:" + cl + "KB" + " 当前读取的是第" + pItems + "项"); // 计算剩余的字节数 BigDecimal ll = cl.subtract(br); System.out.println("剩余" + ll + "KB"); // 计算 上传的百分比 BigDecimal per = br.multiply(new BigDecimal(100)).divide( cl, 2, BigDecimal.ROUND_HALF_UP); System.out.println("当前上传了" + per + "%"); // 上传的用时 开始的时间减去现在的时间 // 每次的用时 long nowTime = System.currentTimeMillis(); long useTime = (nowTime - beginTime) / 1000; System.err.println("用时时间为" + useTime + "秒"); // 上传的速度 BigDecimal speed = new BigDecimal(0); if (useTime != 0) { // 防止上传速度太快 导致usetime为零 speed = br.divide(new BigDecimal(useTime), 2, BigDecimal.ROUND_HALF_UP); System.out.println("上传的速度:" + speed + "KB/S"); } // 大致的剩余时间 剩余的字节数除以速度 BigDecimal ltime = new BigDecimal(0); if (!speed.equals(new BigDecimal(0))) { ltime = ll.divide(speed, 2, BigDecimal.ROUND_HALF_UP); } System.out.println("大致剩余时间:" + ltime + "秒"); System.out.println(); } }); // 3.利用文件上传核心类进行解析request 抛出异常 返回一个list集合 fileitem List<FileItem> list = fileupload.parseRequest(request); // 4.遍历list for (FileItem item : list) { if (item.isFormField()) { // 普通字段项 String name = item.getFieldName(); String value = item.getString("utf-8"); // 解决文件乱码的问题 // value = new String(value.getBytes("iso8859-1"), "utf-8"); System.out.println("文件描述信息:" + name + ":" + value); } else { // 当前是一个文件上传项 String filename = item.getName(); filename = IOUtils.getrealfilename(filename); // UUID 唯一标识 分目录存贮 String uuidname = UUID.randomUUID().toString() + "_" + filename; int uuid_hashcode = uuidname.hashCode(); String hashstr = Integer.toHexString(uuid_hashcode); char[] hss = hashstr.toCharArray(); String path = this.getServletContext().getRealPath( "WEB-INF/upload"); for (char c : hss) { path += "/" + c; } new File(path).mkdirs(); InputStream in = item.getInputStream(); // 定义一个文件输出流 指向WebRoot中的Upload文件夹 // 获取servletcontext // 获得路径this.getServletContext().getRealPath指向webroot OutputStream out = new FileOutputStream(new File(path, uuidname)); // 直接写"upload" 再tomcat启动文件bin目录下寻找文件 // 不能接绝对硬盘路径 // 获取servletcontext 获得路径 // 两个流对接 IOUtils.In2Out(in, out); IOUtils.close(in, out); // 删除临时文件 item.delete(); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
这部分是工具类的源码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class IOUtils { // 工具类 写入io文件 private IOUtils() { } // 获取文件路径中的文件名 针对某些浏览器不能返回一个文件名 而是一个文件的绝对路径 public static String getrealfilename(String str) { String[] s = str.split("\\\\", 1024); return s[s.length - 1]; } public static void In2Out(InputStream in, OutputStream out) throws IOException { byte[] bs = new byte[1024]; int i = 0; while ((i = in.read(bs)) != -1) { out.write(bs, 0, i); } } public static void close(InputStream in, OutputStream out) { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } finally { in = null; } try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } finally { out = null; } } }
这是jsp页面的内容
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h1>文件上传</h1> <hr> <form action="${pageContext.request.contextPath }/servlet/UploadServlet" method="post" enctype="multipart/form-data"> 描述信息: <input type="text" name="description"> <input type="submit" name="name"> <input type="file" name="file1"> </form> </body> </html>
相关文章推荐
- java多态
- JAVA Socket编程
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Java遍历一个目录下的所有文件
- Spring之十一 整合quartz触发器
- spring中MessageSource的配置使用方法2--ReloadableResourceBundleMessageSource
- java值传递还是引用传递
- spring data jpa 定义全局接口BaseDao
- java入门十一
- java入门十
- javat入门九
- java入门八
- java枚举类型学习
- java入门七
- java入门六
- java入门五
- 一个例子让你了解Java反射机制
- java入门四
- java入门三
- java入门二