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>
- FileUpload上传的基本步骤 2
- FileUpload上传的基本步骤 1
- commons-fileupload组件实现的文件基本上传
- FileUpload的文件上传
- coding上传项目的基本步骤
- ASP.NET基本控件FileUpload上传控件
- fileUpload上传文件的方法
- Commons-fileupload 文件的上传
- Apache的fileupload上传文件
- Web_文件的上传-FileUpload
- FileUpload组件图片的上传
- Java中关于文件上传的基本处理方法Commons-FileUpload
- fileupload上传
- fileupload上传
- 【使用Common-FileUpload框架上传文件基本代码】
- 用aparche的FileUpload类实现上传
- commons-fileupload-1.2上传发现的新问题
- FileUpload实现图片的上传,类型,大小
- android简易网页播放器
- 如何做个优秀的程序员,优秀程序员的十个习惯
- 怎样成为优秀的程序员
- 软件包 javax.servlet.http 不存在 import javax.servlet.http.*; 如果是用editplus
- The Scientist and Engineer's Guide to Digital Signal Processing
- FileUpload上传的基本步骤 2
- C++中使用Lambda演算
- 程序员面试宝典(三)P107
- Servlet 1
- eclipse svn配置 (感谢同事的辛勤劳动)
- 开源软件协议
- 一个基于Qt的用cvAdaptiveThreshold二值化图像的程序
- web中的路径问题
- GStreamer资料整理(包括摄像头采集,视频保存,远程监控,流媒体RTP传输)