FileUpload 的问题
在实际操作上对于这种组件存在以下几个不便之处:
1、无法像使用request.getParameter()方法那样准确的取得提交的参数
2、无法像使用request.getParameterValues() 那样准确的取得一组提交参数
3、所有的上传文件都需要进行依次的判断,才能给分别保存,不能依次性批量保存
针对如上问题,因此得到如下包装类
FileUploadTool 类 (包装可以完成自动上传的工具类) 以下是方法
1、 public FileUploadTools(HttpServletRequest request, int maxSize, String tempDir) throws Exception 类型--> 构造 描述 --> 实例化FileUpload类,并接收request对象、最大上传文件限制、上传临时保存目录路径
2、public String getParameter(String name) 类型--> 普通 描述 --> 根参数名称取得参数内容
3、 public String[] getParameterValues(String name) 类型--> 普通 描述 --> 根参数名称,取得一组参数内容
4、public Map<String, FileItem> getUploadFiles() 类型--> 普通 描述 --> 取得全部的上传文件
5、public List<String> savaAll(String saveDir) throws IOException 类型---> 普通 描述 --> 自动保存全部的上传文件,并将已上传文件的名称返回给调用处
用到的包有:
/*
D:\java rj\web\tomcat-6.0.18\lib\servlet-api.jar
servlet-api.jar
commons-io-2.1.jar
commons-fileupload-1.2.2.jar
上面3个包拷贝到C:\jdk6.0\jre\lib\ext
*/
用到的类有: IPTimeStamp 文件随机自动命名 FileUploadTools 文件上传工具类 (以下代码仍不完善,如需用还要改善,用到框架过后此方法也不这么麻烦了,此方法只用)
// IPV6 文件随机自动命名
package com.demo.iptime;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class IPTimeStamp {
private SimpleDateFormat sdf = null;
private String ip = null;
public IPTimeStamp() {}
public IPTimeStamp(String ip) {
this.ip = ip;
}
public String getIPTimeRand() {
StringBuffer buf = new StringBuffer();
if(this.ip != null) {
String s[] = this.ip.split("\\:|\\%"); //用正则表达式解析ipv6地址 fe80::f442:fa63:14f1:9057%10
for(int i=0; i<s.length; i++) {
buf.append(this.addZero(s[i],4));
}
}
buf.append(this.getTimeStamp());
Random r = new Random(); //后面随机数 加 3位
for(int i=0; i<3; i++) {
buf.append(r.nextInt(10)); //所有的数不超过 10
}
return buf.toString();
}
//返回时间戳
public String getDate() {
this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return this.sdf.format(new Date());
}
public String getTimeStamp() {
this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
return this.sdf.format(new Date());
}
private String addZero(String str,int len) {
StringBuffer s = new StringBuffer();
s.append(str);
while(s.length() < len) {
s.insert(0,"0");
}
return s.toString();
}
public static void main(String args[]) {
System.out.println(new IPTimeStamp("fe80::f442:fa63:14f1:9057%10").getIPTimeRand());
}
}
package com.demo.tool;
import java.util.*;
import java.io.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;
import com.demo.iptime.*;
import javax.servlet.http.*;
/*
D:\java rj\web\tomcat-6.0.18\lib\servlet-api.jar
servlet-api.jar
commons-io-2.1.jar
commons-fileupload-1.2.2.jar
上面3个包拷贝到C:\jdk6.0\jre\lib\ext
*/
public class FileUploadTools {
private HttpServletRequest request = null;
private List<FileItem> items = null;
private Map<String,List<String>> params = new HashMap<String,List<String>>(); //保存全部的普通文件 加List是为了预防出现复杂表单 例如:复选框
private Map<String,FileItem> files = new HashMap<String,FileItem>(); // 保存全部的上传文件
public FileUploadTools(HttpServletRequest request, int maxSize, String tempDir) throws Exception {
this.request = request; //这个request 保存下来是因为 init() 方法要取得当前对象的名称
DiskFileItemFactory factory = new DiskFileItemFactory(); //创建磁盘工厂
if(tempDir != null) { //目录不为空
factory.setRepository(new File(tempDir)); //保存
}
ServletFileUpload upload = new ServletFileUpload(factory); //创建处理工具
if(maxSize > 0) {
upload.setFileSizeMax(maxSize); //设置上传文件的大小
}
this.items = upload.parseRequest(request); //接收上传全部内容(图片、文字..)
this.init();
}
// 类型区分
private void init() {
Iterator<FileItem> iter = this.items.iterator();
IPTimeStamp its = new IPTimeStamp(this.request.getRemoteAddr());
while(iter.hasNext()) {
FileItem item = iter.next();
if(item.isFormField()) { //是普通参数
String name = item.getFieldName(); // 取得参数名称
String value = item.getString(); //取得参数内容
List<String> temp = null;
if(this.params.containsKey(name)) { //判定是否存在这个key
temp = this.params.get(name); // 如果有就取出一个List集合
} else {
temp = new ArrayList<String>(); //如果没有,就是设置一个List集合
}
temp.add(value); //增加值
this.params.put(name,temp); //重新设置一个新值,有重复自己会覆盖掉
} else { //按照文件
String fileName = its.getIPTimeRand() + "." + item.getName().split("\\.")[1]; //split("\\.")[1] 拆分文件取第一个
this.files.put(fileName,item); //保存全部上传文件
}
}
}
public String getParameter(String name) { //根据参数名称取出对应的内容来
String ret = null;
List<String> temp = this.params.get(name);
if(temp != null) {
ret = temp.get(0); //因为List只能是单个
}
return ret;
}
//根参数名称,取得一组参数内容
public String[] getParameterValues(String name) {
String ret[] = null;
List<String> temp = this.params.get(name);
if(temp != null) {
ret = temp.toArray(new String[]{}); //将所有的内容取出 字符串
}
return ret;
}
public Map<String,FileItem> getUploadFiles() { //得到所有文件的名称
return this.files;
}
//保存之后一定要有名字
public List<String> saveAll(String saveDir) throws IOException {
List<String> names = new ArrayList<String>();
if(this.files.size() >0 ) { //有内容
Set<String> keys = this.files.keySet(); //key是文件的名称
Iterator<String> iter = keys.iterator();
File saveFile = null;
InputStream input = null;
OutputStream out = null;
while(iter.hasNext()) {
FileItem item = this.files.get(iter.next());
String fileName = new IPTimeStamp(request.getRemoteAddr()).getIPTimeRand()+"."+item.getName().split("\\.")[1];
saveFile = new File(saveDir + fileName);
names.add(fileName); //名字不返回后期无法操作
try
{
input = item.getInputStream();
out = new FileOutputStream(saveFile);
int temp = 0;
byte data[] = new byte[512];
while((temp=input.read(data,0,512)) != -1) {
out.write(data);
}
}
catch (IOException e)
{
throw e;
} finally {
try
{
input.close();
out.close();
}
catch (IOException e1)
{
throw e1;
}
}
}
}
return names;
}
}
以下是表单对以上类作用的操作:
<%@ page contentType="text/html" pageEncoding="gb2312"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<form action="fileupload_3.jsp" method="post" enctype="multipart/form-data">
名称: <input type="text" name="uname"><br>
兴趣:<input type="checkbox" name="inst" value="PK"> 打架
<input type="checkbox" name="inst" value="Run">跑步
<input type="checkbox" name="inst" value="Beauty">美女<br>
照片: <input type="file" name="pic1"><br>
照片: <input type="file" name="pic2"><br>
照片: <input type="file" name="pic3"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>
<%-- fileupload_2.jsp ---%>
<%@ page contentType="text/html" pageEncoding="gb2312"%>
<%@ page import="java.util.*,java.io.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="com.demo.iptime.*"%>
<%@ page import="com.demo.tool.*"%>
<html>
<head> <title>欢迎光临</title>
</head>
<%
request.setCharacterEncoding("gb2312");
%>
<body>
<%
FileUploadTools fut = new FileUploadTools(request,3*1024*1024,this.getServletContext().
getRealPath("/")+ "uploadtemp");
String name = fut.getParameter("uname"); //接收参数uname
String inst[] = fut.getParameterValues("inst"); //接收参数inst
List<String> all = fut.saveAll(this.getServletContext().getRealPath("/")+
"upload"+java.io.File.separator); //得到所有文件的名称
%>
<h3>姓名:<%=name%></h3>
<h3>兴趣:
<%
for(int x=0; x<inst.length; x++) {
%>
<%=inst[x]%>
<%
}
%>
</h3>
<h3>
<%
Iterator<String> iter = all.iterator();
while(iter.hasNext()) {
%>
<img src="../upload/<%=iter.next()%>">
<%
}
%>
</h3>
</body>
</html>