FileUpload上传的基本步骤 2

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>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值