JAVA WEB开发之文件上传相关jar包的学习

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值