Commons FileUpload组件使用方法
- 格式:doc
- 大小:42.50 KB
- 文档页数:8
Java使⽤Commons-FileUpload组件实现⽂件上传最佳⽅案学习的⽬标使⽤commons-fileupload实现⽂件上传使⽤commons-fileupload封装⽂件上传⼯具类什么是commons-fileupload?The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller.FileUpload包可以很容易地添加强⼤的,⾼性能,⽂件上传到你的Servlet的Web应⽤程序的能⼒。
FileUpload解析HTTP请求符合RFC 1867年,“在HTML的⽂件上传。
就是说,如果⼀个HTTP请求是使⽤POST⽅法提交,并与⼀个内容类型“multipart/form-data”,然后FileUpload可以解析这个请求,并把结果提供⼀个容易使⽤的调⽤⽅式。
为什么要使⽤commons-fileupload在使⽤传统的Servlet上传的时候我们可以使⽤req.getInputStream()来获取⽂件上传的流,我们在获取到这个流之后需要⼿动的针对这个流进⾏特殊处理进⾏去流中不必要的开始和结束内容,才能真正的获取到流的内容,本章节并不对原始Servlet的上传进⾏探究,我们另开章节针对原始Servelt上传进⾏探究。
关于Commons-fileupload的上传组件Apache的上传组件其它已经被封装到Struts那中去了,我在网上找到了一些文章介绍它是如何上传文件的,自己跟了一下源码也写了一个上传的实例,仅供参考!一、JSP页面如下:Html代码1<form method="POST" action="UploadServlet"2 ENCTYPE="multipart/form-data">3<table>4<tr><td><input type="text" name="subject" /></td></tr> 5<tr><td><input type="text" name="subject" /></td></tr> 6<tr><td><input type="file" name="file1" /></td></tr>7<tr><td><input type="file" name="file2" /></td></tr>8<tr><td><input type="file" name="file3" /></td></tr>9<tr><td><input type="submit" value="上传"/></td></tr> 10</table>11</form>12<br/>13<a href="DownLoadServlet">下载</a>二、上传的Servlet如下:Java代码14/**15 * Apache组件上传16 *17 * @author mingxue.zhang@18 * @date 2010-10-3019 */20public class UploadServlet extends HttpServlet {2122private static final long serialVersionUID = 5827821285414610443L;2324public void doGet(HttpServletRequest request, HttpServletResponse response)25throws ServletException, IOException {26this.doPost(request, response);27 }2829public void doPost(HttpServletRequest request, HttpServletResponse response)30throws ServletException, IOException {31 // 上传文件目录32 String uploadDir =this.getServletContext().getRealPath("/uploadDir");33 DiskFileItemFactory factory = new DiskFileItemFactory();34 // 设置内存区块大小4KB35 factory.setSizeThreshold(4 * 1024);36 // 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转37 factory.setRepository(newFile(this.getServletContext().getRealPath(38 "/temp")));39 ServletFileUpload fileUpload = new ServletFileUpload(factory);40 fileUpload.setSizeMax(1024 * 1024 * 100);41 fileUpload.setFileSizeMax(1024 * 1024 * 10);42 List<FileItem> fileItemList = null;4344try {45 fileItemList = fileUpload.parseRequest(request);46 } catch (FileUploadException e) {47 e.printStackTrace();48 }49 Iterator<FileItem> fileItemIterator = fileItemList.iterator();50 FileItem fileItem = null;51while (fileItemIterator.hasNext()) {52 fileItem = fileItemIterator.next();53 // 普通文件框上传54if (fileItem.isFormField()) {55 String filedName = fileItem.getFieldName();56 String filedValue = fileItem.getString("GBK");// 编码格式57 System.out.println(filedName);// 文件框名称58 System.out.println(filedValue);// 文件的值59 } else {60 String filedName = fileItem.getFieldName();// 文件上传框的名称61 // 获取文件上传的文件名62 String OriginalFileName =takeOutFileName(fileItem.getName());63 System.out.println("原始文件名:"+OriginalFileName);64if (!"".equals(OriginalFileName)) {65 // 根据上传的文件名重新命名66 String newFileName =getNewFileName(OriginalFileName);67 System.out.println("重新名:"+newFileName);68 File writeToFile = new File(uploadDir + File.separator69 + newFileName);70try {71 fileItem.write(writeToFile);72 } catch (Exception e) {73 e.printStackTrace();74 }75 }76 }77 }78 }7980private String takeOutFileName(String filePath) {81 String fileName = filePath;82if (null != filePath && !"".equals(filePath)) {83int port = stIndexOf("\\" + 1);84if(port != -1){85 fileName = filePath.substring(port);86 }87 }88return fileName;89 }9091private String getNewFileName(String originalFileName) {92 StringBuffer newFileName = new StringBuffer();93if (null != originalFileName && !"".equals(originalFileName)) { 94int port = stIndexOf(".");95 String type = "";96 String fileName = "";97if (port != -1) {98 type = originalFileName.substring(port + 1);99 fileName = originalFileName.substring(0, port);100 } else {101 fileName = originalFileName;102 }103 StringBuffer suffix = new StringBuffer("_");104 suffix.append(Calendar.getInstance().getTimeInMillis()); 105 suffix.append("_");106 suffix.append(new Random().nextInt(100));107 newFileName.append(fileName);108 newFileName.append(suffix);109 newFileName.append(".");110 newFileName.append(type);111 }112return newFileName.toString();113 }114115}三、下载的Servlet如下:Java代码116/**117 * Apache组件下载118 *119 * @author mingxue.zhang@120 * @date 2010-10-30121 */122public class DownLoadServlet extends HttpServlet {123124public void doGet(HttpServletRequest request, HttpServletResponseresponse)125throws ServletException, IOException {126this.doPost(request, response);127 }128129public void doPost(HttpServletRequest request, HttpServletResponse response)130throws ServletException, IOException {131 String filePath ="D:\\Tomcat\\apache-tomcat-6.0.26\\webapps\\ApacheUpload\\uploadDir\\";132 String fileName = "2010年10月安排2_1288447490125_56.txt";133 String Originalname = "2010年10月安排2.txt";134 response.setContentType("application/octet-stream");135 String isoFileName = new String(Originalname.getBytes("GB2312"), 136 "ISO8859-1");137 response.setHeader("Content-Disposition", "attachment; filename="138 + isoFileName);139 ServletOutputStream out = response.getOutputStream();140 BufferedOutputStream bufferOut = new BufferedOutputStream(out);141 FileInputStream inputStream = new FileInputStream(newFile(filePath,142 fileName));143 BufferedInputStream bufferInput = newBufferedInputStream(inputStream);144byte[] buffer = new byte[5 * 1024];145int length = 0;146while ((length = bufferInput.read(buffer)) != -1) {147 bufferOut.write(buffer, 0, length);148 }149 bufferInput.close();150 inputStream.close();151 bufferOut.close();152 out.close();153 }154155}Servlet配置如下:Xml代码156<servlet>157<servlet-name>UploadServlet</servlet-name>158<servlet-class>com.mengya.servlet.UploadServlet</servlet-class> 159</servlet>160<servlet>161<servlet-name>DownLoadServlet</servlet-name>162<servlet-class>com.mengya.servlet.DownLoadServlet</servlet-class>163</servlet>164165<servlet-mapping>166<servlet-name>UploadServlet</servlet-name>167<url-pattern>/UploadServlet</url-pattern>168</servlet-mapping>169<servlet-mapping>170<servlet-name>DownLoadServlet</servlet-name>171<url-pattern>/DownLoadServlet</url-pattern>172</servlet-mapping>。
文件上传和下载
javaweb文件上传简单介绍
文件的上传和下载在企业级应用中很常见,javaee通常使用commons-fileupload.jar配合commons-io.jar实现文件的上传下载。
具体实现过程如下
准备相应的jar包,并且导入。
写带有文件表单的上传文件的jsp页面,以及处理的后台servlet。
文件的下载
下载就是向客户端响应字节数据!
原来我们响应的都是HTML字符数据!
把一个文件编程字节数组:使用response.getOutputStream()
文件下载操作,最重要的步骤:两个头一个流
第一个头:Content-type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
第二个头;Content-Disosition:它的默认值是inline,表示在浏览器窗口中打开!attachment;filename=xxx
流:要下载的文件数据
Attachment翻译为附件
下载的具体编码。
1.连接数据库PreSDB.javapackage notice.tools;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class PreSDB {private Connection con;private PreparedStatement pstm;private String user="user";private String password="password";private String className="oracle.jdbc.driver.OracleDriver";//本例使用的是oracle数据库private String url="jdbc:oracle:thin:@数据库IP地址:端口号(一般用1521):数据库名称";如“jdbc:oracle:thin:@10.1.1.10:1521:DB”/** 构造方法,在该方法中加载数据库驱动*/public PreSDB(){try{Class.forName(className);}catch(ClassNotFoundException e){System.out.println("加载数据库驱动失败!");e.printStackTrace();}}/**创建数据库连接*/public Connection getCon(){if(con==null){try {con=DriverManager.getConnection(url,user,password);} catch (SQLException e) {System.out.println("创建数据库连接失败!");con=null;e.printStackTrace();}}return con;}/***@功能:对数据库进行增、删、改、查操作*@参数:sql为SQL语句;params为Object数组,里面存储的是为sql表示的SQL语句中"?"占位符赋值的数据*/public void doPstm(String sql,Object[] params){if(sql!=null&&!sql.equals("")){if(params==null)params=new Object[0];getCon();if(con!=null){try{System.out.println(sql);pstm=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_REA D_ONL Y);for(int i=0;i<params.length;i++){pstm.setObject(i+1,params[i]);}pstm.execute();}catch(SQLException e){System.out.println("doPstm()方法出错!");e.printStackTrace();}}}}/*** @功能:获取调用doPstm()方法执行查询操作后返回的ResultSet结果集* @返回值:ResultSet* @throws SQLException*/public ResultSet getRs(){ResultSet rs=null;try{rs= pstm.getResultSet();}catch(SQLException e){e.printStackTrace();}return rs;}/*** @功能:获取调用doPstm()方法执行更新操作后返回影响的记录数* @返回值:int* @throws SQLException*/public int getCount() throws SQLException{return pstm.getUpdateCount();}/*** @功能:释放PrepareStatement对象与Connection对象*/public void closed(){try{if(pstm!=null)pstm.close();}catch(SQLException e){System.out.println("关闭pstm对象失败!");e.printStackTrace();}try{if(con!=null){con.close();}}catch(SQLException e){System.out.println("关闭con对象失败!");e.printStackTrace();}}}2.应用到的beanNoticeInfo.javapackage notice.model;public class NoticeInfo implements java.io.Serializable{private int id;private String date; //公告发表日期private String subject;//主题private String sender;//发表者private String content;//内容private int visit=0;//访问次数private String remark;//备注private String command;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getSubject() {return subject;}public void setSubject(String subject) { this.subject = subject;}public String getSender() {return sender;}public void setSender(String sender) {this.sender = sender;}public String getContent() {return content;}public void setContent(String content) { this.content = content;}public int getVisit() {return visit;}public void setVisit(int visit) {this.visit = visit;}public String getRemark() {return remark;}public void setRemark(String remark) { this.remark = remark;}public String getCommand() {return command;}public void setCommand(String command) { mand = command;}}NoticeFileInfo.javapackage notice.model;public class NoticeFileInfo implements java.io.Serializable{ private int nfid;;private String nfname;private String nftype;private int nfsize;private String nfadress;private int noticeid;//另一表的外键public int getNfid() {return nfid;}public void setNfid(int nfid) {this.nfid = nfid;}public String getNfname() {return nfname;}public void setNfname(String nfname) {this.nfname = nfname;}public String getNftype() {return nftype;}public void setNftype(String nftype) {this.nftype = nftype;}public int getNfsize() {return nfsize;}public void setNfsize(int nfsize) {this.nfsize = nfsize;}public String getNfadress() {return nfadress;}public void setNfadress(String nfadress) {this.nfadress = nfadress;}public int getNoticeid() {return noticeid;}public void setNoticeid(int noticeid) {this.noticeid = noticeid;}}3.应用方法&接口NoticeDao.javaimport notice.model.NoticeFileInfo;import notice.model.NoticeInfo;import notice.tools.PreSDB;public class NoticeDao implements NoticeDaoImp{private PreSDB mydb=null;private String sql="";//获取表单ID,实现ID号自动递增功能public int getNoticeID(){mydb=new PreSDB();int id=0;sql="select NOT_ID from T_NOTICE order by NOT_ID desc";mydb.doPstm(sql, null);try{ResultSet rs=mydb.getRs();if(rs !=null){if(rs.next()){id=rs.getInt(1)+1;}}else{id=0;}}catch(SQLException e){e.printStackTrace();}return id;}public int getNoticeFileID(){int id=0;mydb=new PreSDB();sql="select NF_ID from T_NOTICEFILE order by NF_ID desc";mydb.doPstm(sql, null);try{ResultSet rs=mydb.getRs();if(rs !=null){if(rs.next()){id=rs.getInt(1)+1;}}else{id=0;}}catch(SQLException e){e.printStackTrace();}return id;}//查找noticefile表单中是否已存在同名文档public NoticeFileInfo getFileTruename(String truename){NoticeFileInfo noticeFileInfo=null;mydb=new PreSDB();sql="select * from t_noticefile where NF_TRUENAME=?";Object[] params={truename};mydb.doPstm(sql, params);try{ResultSet rs=mydb.getRs();while(rs.next()){noticeFileInfo=new NoticeFileInfo();noticeFileInfo.setNfid(rs.getInt("NF_ID"));noticeFileInfo.setNfname(rs.getString("NF_TRUENAME"));noticeFileInfo.setNftype(rs.getString("NF_TYPE"));noticeFileInfo.setNfsize(rs.getInt("NF_SIZE"));noticeFileInfo.setNfadress(rs.getString("NF_ADDRESS"));noticeFileInfo.setNoticeid(rs.getInt("NF_NOTICEID"));}}catch(SQLException e){e.printStackTrace();}return noticeFileInfo;}录入数据public int addNoticeInfo(NoticeInfo noticeInfo){int i=-1;mydb=new PreSDB();sql="insert into T_NOTICE(NOT_ID,NOT_DATE,NOT_SUBJECT,NOT_SENDER," + "NOT_CONTENT,NOT_VISIT,NOT_REMARK,NOT_COMMAND)values(?,?,?,?,?,?,?,?)";Object[] params={noticeInfo.getId(),noticeInfo.getDate(),noticeInfo.getSubject(),noticeInfo.getSender(),noticeInfo.getContent(),noticeInfo.getVisit(),noticeInfo.getRemark(),noticeInfo.getCommand()};mydb.doPstm(sql, params);try{i=mydb.getCount();}catch(SQLException e){i=-1;e.printStackTrace();}return i;}录入数据public int addNoticeFileInfo(NoticeFileInfo noticeFileInfo){int i=-1;mydb=new PreSDB();sql="insert into T_NOTICEFILE(NF_ID,NF_TRUENAME,NF_TYPE,NF_SIZE," +"NF_ADDRESS,NF_NOTICEID) values(?,?,?,?,?,?)";Object[] params={noticeFileInfo.getNfid(),noticeFileInfo.getNfname(),noticeFileInfo.getNftype(), noticeFileInfo.getNfsize(),noticeFileInfo.getNfadress(),noticeFileInfo.getNoticeid()};mydb.doPstm(sql, params);try{i=mydb.getCount();}catch(SQLException e){i=-1;e.printStackTrace();}return i;}}接口NoticeDaoImp.javapackage notice.dao;import notice.model.NoticeFileInfo;import notice.model.NoticeInfo;public interface NoticeDaoImp {public int getNoticeID();public int getNoticeFileID();public NoticeFileInfo getFileTruename(String truename);public int addNoticeInfo(NoticeInfo noticeInfo);public int addNoticeFileInfo(NoticeFileInfo noticeFileInfo);}4.应用servlet程序NoticeServlet.javapackage notice.servlet;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import notice.dao.NoticeDao;import notice.model.NoticeFileInfo;import notice.model.NoticeInfo;import java.io.File;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import mons.fileupload.FileItem;import mons.fileupload.FileUploadException;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;public class NoticeServlet extends HttpServlet{public NoticeServlet() {super();}public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}//先定义一些变量private int method;private HttpSession session = null;private NoticeInfo noticeInfo=null;private NoticeDaoImp noticeDao=null;private NoticeFileInfo noticeFileInfo=null;protected void doGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doPost(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {method = Integer.parseInt(request.getParameter("method"));if(method == 1){this.uploadAndPublish(request, response);}}private void uploadAndPublish(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException,ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String adjunctname ;String fileDir = request.getSession().getServletContext().getRealPath("/")+".."+ File.separator+"upload"+ File.separator+ "files"+ File.separator+ "notice";//tomcat服务器所在地址为C:\Tomcat 7.0;//现文件存储地址为C:\Tomcat 7.0\webapps\upload\files\noticeString message = "";noticeDao=new NoticeDao();noticeInfo=new NoticeInfo();noticeFileInfo=new NoticeFileInfo();Date d = new Date();int noticeid=0;noticeid=noticeDao.getNoticeID();//获取表t_notice IDString uptime=StringHandler.timeTostr(d);String subject="";String sender="";String content="";int visit=0;String remark="";String command=new String(request.getParameter("command").getBytes("ISO-8859-1"),"UTF-8");int nfid=0;String nfname="";String nftype="";int nfsize=0;String address = "";int k=0;if(ServletFileUpload.isMultipartContent(request)){DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(20*1024); //设置内存中允许存储的字节数factory.setRepository(factory.getRepository()); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8");int size = 5*1024*1024;List<FileItem> formlists = null;try {formlists = upload.parseRequest(request);} catch (FileUploadException e) {e.printStackTrace();}Iterator<FileItem> iter = formlists.iterator();while(iter.hasNext()){FileItem formitem = (FileItem)iter.next();if(formitem.isFormField()){String formname=formitem.getFieldName();String con=formitem.getString("UTF-8");if(formname.equals("subject")){subject=con;noticeInfo.setSubject(subject);}else if(formname.equals("sender")){sender=con;noticeInfo.setSender(sender);}else if(formname.equals("content")){content=con;noticeInfo.setContent(content);}else if(formname.equals("remark")){remark=con;noticeInfo.setRemark(remark);}noticeInfo.setId(noticeid);noticeInfo.setDate(uptime);noticeInfo.setVisit(visit);noticeInfo.setCommand(command);}else{String name = formitem.getName();if(formitem.getSize()>size){message = "您上传的文件太大,请选择不超过5M的文件";break; //终止循环}String adjunctsize = new Long(formitem.getSize()).toString();if((name == null) ||(name.equals(""))&&(adjunctsize.equals("0")))continue;//该句以下不执行,上返回继续执行循环adjunctname = name.substring(stIndexOf("\\")+1,name.length()); //获取上传文件名称address = fileDir+"\\"+adjunctname;File saveFile = new File(address);nfid=noticeDao.getNoticeFileID();获取表t_noticefile IDnfname=adjunctname;nftype=formitem.getContentType();nfsize=(int)formitem.getSize();noticeFileInfo.setNfid(nfid);noticeFileInfo.setNfname(nfname);noticeFileInfo.setNftype(nftype);noticeFileInfo.setNfsize(nfsize);noticeFileInfo.setNfadress(address);noticeFileInfo.setNoticeid(noticeid);if(noticeDao.getFileTruename(nfname)!=null){message="您上传的文件已存在或有重名";break;}try {formitem.write(saveFile);noticeDao.addNoticeFileInfo(noticeFileInfo);} catch (Exception e) {e.printStackTrace();message="文件上传失败";}}}}if(message.equals("")){k=noticeDao.addNoticeInfo(noticeInfo);if(k>0){message="公告发表成功";}else{message="公告发表失败";}}out.print("<script language=javascript>alert('" + message+ "');history.go(-1);</script>");}}5.上传和录入信息页面insertNotice.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>发表公告</title><META HTTP-EQUIV="Pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"><META HTTP-EQUIV="Expires" CONTENT="0"><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><script language="javascript" type="text/javascript">if(form.subject.value==""){alert(form.subject.title);return false;}if(form.sender.value==""){alert(form.sender.title);return false;}if(form.content.value==""){alert(form.content.title);return false;}}function addMoreRow(){var perent = event.srcElement.parentNode.parentNode;var oTable = perent.parentNode.parentNode;if(oTable.rows.length<6){oNewRow = oTable.insertRow();for(i=0;i<perent.cells.length;i++){oNewRow.insertCell().innerHTML=perent.cells[i].innerHTML;}perent.all("DelBtn").disabled=false;oNewRow.all("DelBtn").disabled=false;} else{perent.all("insertButton").disabled= false;oNewRow.all("insertButton").disabled=false;alert("最多只能上传5个文件");}}function deleteMoreRow(){var perent=event.srcElement.parentNode.parentNode;var table=perent.parentNode.parentNode;if(table.rows.length>2){table.deleteRow(perent.rowIndex);if(table.rows.length==2){table.all("DelBtn").disabled=true;}}}function DisabledKeyInput(){if(form.FilePath.value==""){alert("请确定要上传的文件");return false;}if(event.keyCode!=8&&event.keyCode!=46){event.returnValue=false;}}</script><SCRIPT language=JavaScript><!--var LastCount =0;function CountStrByte(Message,Total,Used,Remain){ //字节统计var ByteCount = 0;var StrValue = Message.value;var StrLength = Message.value.length;var MaxValue = Total.value;if(LastCount != StrLength) { // 在此判断,减少循环次数for (i=0;i<StrLength;i++){ByteCount = (StrValue.charCodeAt(i)<=256) ? ByteCount + 1 : ByteCount + 2;if (ByteCount>MaxV alue) {Message.value = StrValue.substring(0,i);alert("留言内容最多不能超过" +MaxValue+ " 个字节!\n注意:一个汉字为两字节。
FileUpload 是Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
[编辑本段]一、使用组件FileUpload可以通过许多种不同的方式使用组件FileUpload,这个主要取决于你的应用程序。
在最简单的情况下,你可以调用单一的方法去解析这个Servlet Request,然后处理选项列表,并应用到你的应用程序。
另一方面,你可能决定自定义FileUpload,实现对选项列表种个别项完全控制。
例如:你可以将内容注入到数据库。
这里,我们将描述组件FileUpload的基本原则,并讲解一些简单的、常用的使用模式。
FileUpload自定制将在其他地方描述。
组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本。
(这里FileUpload版本为:commons- fileupload-1.2.1,Commons IO版本为:commons-io-1.4)[编辑本段]二、组件FileUpload是怎样工作的上传的文件要求包括一个根据RFC 1867(在HTML中基于表单的文件)编码的选项列表清单。
组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。
无论每个项目背后如何执行都实现了FileItem接口。
这里将描述组件FileUpload库的普通API,这些API比较简单。
不过,对于最终的实现,你可以参考最新的API流。
每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。
比如:每一个项目有一个名称name和内容类型congtent type,并提供了一个InputStream访问其数据。
另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。
1.开发环境:1)eclipse3.2+tomcat5.5;2)创建dynamic web project;3)下载:Commons FileUpload 可以在/commons/fileupload/下载附加的Commons IO 可以在/commons/io/下载将commons-fileupload-1.2.1.jar commons-io-1.4.jar拷贝到WebContent\WEB-INF\\lib 目录;2.前台:<;form method=";post"; enctype=";multipart/form-data"; action=";upload.jsp"; target=";_blank";>;<;%-- 类型enctype用multipart/form-data,这样可以把文件中的数据作为流式数据上传,不管是什么文件类型,均可上传--%>;<;table>;<;tr>;<;td>;作品:<;input type=";file"; name=";upfile"; size=";50";>;<;/td>;<;/tr>;<;tr>;<;td>;作者:<;input type=";text"; name=";author"; size=";22";>;标题:<;input type=";text"; name=";title"; size=";22";>;<;input type=";submit"; name=";submit"; value=";上传";>;<;/td>;<;/tr>;<;tr>;<;td>;备注:上传的jpg图片(显示扩展名为.jpg)大小不能超过4M!<;/td>;<;/tr>; <;/table>;<;/form>;3.后台:1)引用:<;%@ page import=";mons.fileupload.servlet.ServletFileUpload";%>; <;%@ page import=";mons.fileupload.disk.DiskFileItemFactory";%>; <;%@ page import=";mons.fileupload.*";%>;2)代码:String id=null;//上传记录idString destinationfileName=null;//目标文件名String author=null;String title=null;int flag=0;//上传标志String uploadPath =request.getSession().getServletContext().getRealPath(";/";)+";upload/";;//图片上传路径String tempPath = request.getSession().getServletContext().getRealPath(";/";)+";upload/temp/";;//图片临时上传路径StringimagePath=request.getScheme()+";://";+request.getServerName()+";:";+request.getS erverPort()+request.getContextPath()+";/";; // 图片网络相对路径if(!new File(uploadPath).isDirectory()) new File(uploadPath).mkdirs();// 文件夹不存在就自动创建:if(!new File(tempPath).isDirectory())new File(tempPath).mkdirs();try {DiskFileUpload fu = new DiskFileUpload();fu.setSizeMax(4194304);// 设置最大文件尺寸,这里是4MBfu.setSizeThreshold(4096);// 设置缓冲区大小,这里是4kbfu.setRepositoryPath(tempPath);// 设置临时目录:List fileItems = fu.parseRequest(request);// 得到所有的文件:Iterator i = fileItems.iterator();while(i.hasNext()) {// 依次处理表单中每个域FileItem file = (FileItem)i.next();// 获得用户上传时文件名if (file.isFormField()){ //获得文本域表单数据if(";author";.equals(file.getFieldName()))author=codeToString(file.getString());if(";title";.equals(file.getFieldName())) title=codeToString(file.getString()); continue;//非file域不处理}String sourcefileName = file.getName();if( sourcefileName.endsWith(";.jpg";)){//生成上传后的文件名Random rd = new Random();Calendar time = Calendar.getInstance();id=String.valueOf(time.get(Calendar.YEAR))+ String.valueOf(time.get(Calendar.MONTH)+1)+ String.valueOf(time.get(Calendar.DAY_OF_MONTH))+ String.valueOf(time.get(Calendar.HOUR_OF_DAY))+ String.valueOf(time.get(Calendar.MINUTE))+ String.valueOf(time.get(Calendar.SECOND))+ String.valueOf(rd.nextInt(100));destinationfileName=id+";.jpg";;File fTmp=new File(uploadPath+destinationfileName);file.write(fTmp);//out.print(";<;img src=";+imagePath+";upload/";+destinationfileName+";>;";); flag=1;//上传成功标志1}else{out.print(";上传失败,只能上传jpg文件!";); }}//out.print(";<;script>;location.href=\";demo.jsp\";;<;/script>;";);}catch (IOException e) {out.print(";上传失败!";);}out.flush();out.close();4.主要解决点:1)问题:form设置enctype=";multipart/form-data";,request.getParameters函数无法获取表单域值;2)解决方案:if (file.isFormField()){ //获得文本域表单数据if(";author";.equals(file.getFieldName()))author=codeToString(file.getString());if(";title";.equals(file.getFieldName())) title=codeToString(file.getString()); continue;//非file域不处理}。
使用fileupload根据你的应用需求,fileupload可以有许多不同的使用方式。
在最简单的情况下,你可以调用一个简单的方法来解析servlet请求,然后在他们提交到你的应用时处理表单列表。
在其它规模的终端上,你也可能决定将fileupload进行自定义,以完全控制个别表单项存储的方法。
比如,你或许会将内容流化来保存到数据中。
在这里。
我们将要描述fileupload的基本使用方法,然后解释一些更简单的,以及最常用的使用模式。
fileupload的个性化在这里得到了描述。
它怎么工作一个文件上传请求由有序表单项的列表组成,这些表单是根据RFC1867来编码的,是在html中基于表单的文件上传。
fileupload能解析这样一个请求然后向你的应用提供一个单独的上传表单项的列表。
每一个这样的表单项实现了FileItem接口,而不需要考虑它潜在的实现方式。
每个文件的表单项拥有一系列可能对你的应用有用的属性,比如,每个项目都有一个名字和文件类型,你就可以提供一个InputStream来取它的数据。
从另一方面说,你可能需要对这些选项进行不同的处理,这个可以根据对这个选项是不是一个规则的表单项来判断,即可以根据这个数据是否来源于普通的文本框或者一个简单的html表单域,还是一个能被上传的文件。
FileItem接口提供了多种方法来判断它是否是一个可上传的文件,然后你就可以用最合适的方式来处理这些数据了。
FileUpload使用FileItemFactory来创建新的文件项目。
这正是给FileUpload带来灵活性的原因。
这个工厂最终控制每个项目的创建。
默认的工厂在内存或者磁盘上保存了项目的数据,这个可以根据项目的大小来定(例如,字节数据)。
当然,这个动作可以通过自定义来满足你应用的需要。
解析请求在你对要上传的选项处理之前,很显然的你得先解析这些请求本身。
很直接的就是要确保这个请求是不是一个要上传的文件,然而FileUpload 使这一点简单化了,你只需提供一个静态的方法来做到这一点。
Commons-fileupload工具的API与开发实例解析(一)文件上传组件的应用与编写在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传邮件附件、个人相片、共享资料等。
对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”即可;但在Web服务器端如何获取浏览器上传的文件,需要进行复杂的编程处理。
为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件。
本章将详细介绍如何使用Apache文件上传组件,以及分析该组件源程序的设计思路和实现方法。
1.1 准备实验环境按下面的步骤为本章的例子程序建立运行环境:(1)在Tomcat 5.5.12的<tomcat的安装目录>\webapps目录中创建一个名为fileupload的子目录,并在fileupload目录中创建一个名为test.html的网页文件,在该文件中写上“这是test.html页面的原始内容!”这几个字符。
(2)在<tomcat的安装目录>\webapps\fileupload目录中创建一个名为WEB-INF 的子目录,在WEB-INF目录中创建一个名为classes的子目录和一个web.xml文件,web.xml文件内容如下:<web-app></web-app>(3)要使用Apache文件上传组件,首先需要安装Apache文件上传组件包。
在<tomcat的安装目录>\webapps\fileupload\WEB-INF目录中创建一个名为lib的子目录,然后从网址/commons/fileupload下载到Apache组件的二进制发行包,在本书的附带带光盘中也提供了该组件的二进制发行包,文件名为commons-fileupload-1.0.zip。
commons-fileupload源码学习⼼得commons-fileupload依赖于commons-io包。
commons-fileupload的使⽤⽅法: 1.创建⼀个⽂件项⽬⼯⼚类DiskFileItemFactory。
DiskFileItemFactory有俩个构造⽅法:1 DiskFileItemFactory() 其中sizeThreshold是默认值10kB, ⽂件⼤⼩不超过这个值将内容保存在内存,超过这个值会把⽂件保存到临时⽬录下,可⽤System.getProperty("java.io.tmpdir")获取;2 DiskFileItemFactory(int sizeThreshold, File repository) 可以指定sizeThreshold, 和⽂件保存到磁盘的路径。
DiskFileItemFactory有⼀个属性FileCleaningTracker,设置这个属性可以⽤来追踪删除临时⽂件。
当这个临时⽂件不再被使⽤时将会被⽴即删除,更精确的说是这个⽂件对象被垃圾收集器回收时,FileCleaningTracker将启动收获者线程(reaper thread)⾃动删除这个临时⽂件。
FileCleaningTracker是commons-io包的⼯具类。
1 FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(servletcontext);2 DiskFileItemFactory factory = new DiskFileItemFactory();3 factory.setFileCleaningTracker(fileCleaningTracker); 4 ServletContext获取的⼏种⽅法:5 Javax.servlet.http.HttpSession.getServletContext();6 Javax.servlet.jsp.PageContext.getServletContext();7 Javax.servlet.ServletConfig.getServletContext(); 2.创建⼀个⽂件处理类ServletFileUpload。
fileupload控件的用法-回复【fileupload控件的用法】是一个用于网页文件上传功能的控件,是开发人员经常使用的工具之一。
本文将一步一步回答有关fileupload控件的用法和使用指南。
第一步:了解fileupload控件的基本概念和作用fileupload控件是一种HTML元素,用于在网页上创建一个可供用户选择文件并上传的控件。
它允许用户通过浏览自己的计算机文件系统,从中选择一个或多个要上传的文件。
主要作用是方便用户将文件传输到服务器上,供网站后台进行处理和存储。
第二步:创建fileupload控件并添加到网页中在HTML代码中,使用<input type="file">标签创建一个fileupload控件,如下所示:<input type="file" name="uploadFile" id="uploadFile">其中,name属性用于指定控件的名称,id属性用于给控件指定一个唯一的标识符,供后续的JavaScript操作使用。
第三步:为fileupload控件添加事件处理程序通过JavaScript代码,可以为fileupload控件添加事件处理程序,以便在用户选择文件后执行相应的操作。
例如,可以为控件的onchange事件添加一个函数,当用户选择文件后自动触发该函数。
示例如下:document.getElementById("uploadFile").onchange = function() { 上传文件的操作}第四步:处理用户上传的文件在事件处理程序中,可以通过fileupload控件的value属性获取用户选择的文件路径。
如下所示:var filePath = document.getElementById("uploadFile").value;但需要注意的是,出于安全考虑,浏览器不允许JavaScript访问用户计算机的文件系统。
Commons FileUpload组件使用方法2010年03月18日 16:04本文以Commons FileUpload组件为例说明怎样为JSP应用添加文件上传功能.当然也有其它组件能实现此功能,本文只是为了说明Commons FileUpload组件的用法.准备工作:1,下载Commons FileUpload组件包,具体可以在网上找,开源的,免费下载.2,下载Commons IO包,上面的组件必须依赖它才能实现功能.该包也在上面的网页上有提供.注意:如果你是使用Tomcat直接开发应用程序,则把上面下载的两个.ZIP文件解压后,将解压后的commons-io-1.4-sources.jar和commons-fileupload-1.2.1.jar两个.jar文件放到tomcat的webapps\你的webapp\WEB-INF\lib\下,目录不存在的话请自己创建.如果你是直接使用MyEclipse进行开发应用,刚把上面的两个.jar文件放到自己创建的用户库里面,在用到这个库时再导入到应用程序中.步骤:1.创建一个Servlet----Upload.java文件,用于实现上传文件import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import mons.fileupload.*;public class Upload extends HttpServlet {private String uploadPath = "d:\\upload\\"; // 上传文件的目录private String tempPath = "d:\\upload\\tmp\\"; // 临时文件目录在doPost()方法中,当servlet收到浏览器发出的Post请求后,实现文件上传。
以下是示例代码:public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException{try {DiskFileUpload fu = new DiskFileUpload();// 设置最大文件尺寸,这里是4MBfu.setSizeMax(4194304);// 设置缓冲区大小,这里是4kbfu.setSizeThreshold(4096);// 设置临时目录:fu.setRepositoryPath(tempPath);// 得到所有的文件:List fileItems = fu.parseRequest(request);//解析用户请求的参数,取出文件上传信息Iterator i = fileItems.iterator();// 依次处理每一个文件:while(i.hasNext()) {FileItem fi = (FileItem)i.next();// 获得文件名,这个文件名包括路径:String fileName = fi.getName();// 在这里可以记录用户和文件信息// ...// 写入文件,暂定文件名为a.txt,可以从fileName中提取文件名:fi.write(new File(uploadPath + "a.txt"));}}catch(Exception e) {// 可以跳转出错页面}}编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。
2.配置servlet,用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml,没有的话新建一个。
典型配置如下:<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "/dtd/web-app_2_3.dtd"><web-app><servlet><servlet-name>Upload</servlet-name><servlet-class>Upload</servlet-class></servlet><servlet-mapping><servlet-name>Upload</servlet-name><url-pattern>/fileupload</url-pattern></servlet-mapping></web-app>3.配置好servlet后,启动tomcat,写一个简单的html测试:<form action="fileupload" method="post"enctype="multipart/form-data" name="form1"><input type="file" name="file"><input type="submit" name="Submit" value="upload"></form>注意action="fileupload"其中fileupload是配置servlet时指定的url-patternprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("CONTENT_TYPE");try {DiskFileUpload diskFileUpload=new DiskFileUpload();diskFileUpload.setHeaderEncoding("GBK");List fileItems=diskFileUpload.parseRequest(req);ErpSTService erpSTService=new ErpSTService();String strWJLJ="";String strTmp="";for(int m=0;m<fileItems.size();m++){FileItem fileItem=(FileItem) fileItems.get(m);if(!fileItem.isFormField()){strWJLJ=fileItem.getName().trim();long size=fileItem.getSize();if((strWJLJ == null || strWJLJ.equals("")) && size == 0){continue;}else{String strUploads=getAddress();if (!new File(strUploads + "erpSt/").isDirectory())new File(strUploads + "erpSt/").mkdirs();strTmp = strUploads + "erpSt"+ "/";diskFileUpload.setRepositoryPath(strTmp);strTmp = strTmp +"impexcl.xls";/////////////////////////////////////////////////////////System.out.println("准备上传文件:" + strTmp);//////////////////////////////////////////////////////////fileItem.write(new File(strTmp));}}}Workbook book = Workbook.getWorkbook(new File(strTmp));Sheet sheet = book.getSheet("Sheet1");// 工作表有数据的行数int lastCell = 0;String curCell = "";// 必填项String strBug = "";if (lastCell == 0) {lastCell = sheet.getRows();System.out.println(lastCell);}// 验证必填项for(int i=1;i<lastCell;i++){Cell cell = sheet.getCell(0, i);if(!cell.getContents().trim().equals("")){cell=sheet.getCell(1,i);if(cell.getContents().trim().equals("")){strBug=strBug+"第"+(i+1)+"行的内容为空,请输入!<br>";}// cell=sheet.getCell(7,i);// if(cell.getContents().trim().equals(""))// {// strBug=strBug+"第"+(i+1)+"行的标准答案为空,请输入!<br>"; // }cell=sheet.getCell(9, i);if(cell.getContents().trim().equals("")){strBug=strBug+"第"+(i+1)+"行的试题类型为空,请输入!<br>"; }}}if(strBug.trim().equals("")){for(int i=1;i<lastCell;i++){ErpSt erpSt=new ErpSt();// System.out.println(sheet);// System.out.println(sheet.getCell(0, i).getContents());// System.out.println(sheet.getCell(1, i).getContents());if(!(sheet.getCell(0,i).getContents().trim().equals("")||sheet.getCell(0,i).getContents().trim()==null)){erpSt.setStbh(Long.parseLong(sheet.getCell(0,i).getContents().trim()));erpSt.setStnr(sheet.getCell(1, i).getContents().trim());erpSt.setDaa(sheet.getCell(2, i).getContents().trim());erpSt.setDab(sheet.getCell(3, i).getContents().trim());erpSt.setDac(sheet.getCell(4, i).getContents().trim());erpSt.setDad(sheet.getCell(5, i).getContents().trim());erpSt.setDae(sheet.getCell(6, i).getContents().trim());if(sheet.getCell(7, i).getContents().trim().equals("正确")||sheet.getCell(7, i).getContents().trim().equals("对")){erpSt.setZqda("T");}else if(sheet.getCell(7, i).getContents().trim().equals("错误")||sheet.getCell(7, i).getContents().trim().equals("错")){erpSt.setZqda("F");}else{erpSt.setZqda(sheet.getCell(7,i).getContents().trim());}erpSt.setErpmk(sheet.getCell(8, i).getContents().trim());if(sheet.getCell(9, i).getContents().trim().equals("单选")){ erpSt.setStlx("1");}else if(sheet.getCell(9, i).getContents().trim().equals("多选")){erpSt.setStlx("2");}else if(sheet.getCell(9, i).getContents().trim().equals("判断")){erpSt.setStlx("3");}else if(sheet.getCell(9, i).getContents().trim().equals("个人实操")){erpSt.setStlx("4");}else{erpSt.setStlx("5");}if(!erpSTService.insert(erpSt)){book.close();FileReaderWriter.delNrglByPath(strTmp);req.setAttribute("imperror", "试题从序号为 "+i+" 行开始导入失败,<br>错误原因可能因为序号在数据库中已存在,请修改Excel表中序号,点击确定重新导入!");req.setAttribute("requestID", "ERP_DW_stdr");req.getRequestDispatcher("/ewns/erp/impexcel/impSucc.jsp").fo rward(req, resp);return;}}else break;}book.close();FileReaderWriter.delNrglByPath(strTmp);req.setAttribute("impok", "恭喜,试题导入成功!,点击确定继续操作。