FileUpload上传的基本步骤 2

来源:互联网 发布:淘宝买药货到付款骗局 编辑:程序博客网 时间:2024/06/05 06:11

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%10for(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.jarservlet-api.jarcommons-io-2.1.jarcommons-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)) {//判定是否存在这个keytemp = 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");  //接收参数unameString inst[] = fut.getParameterValues("inst");  //接收参数instList<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>