您的位置:首页 > 编程语言 > Java开发

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: