如果使用上传操作,并且没有使用框架之类,最好使用Smartupload,因为FileUpdate太难使用。
下载组件:
fileupload包:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
commons包的io包以后框架开发中重要:http://commons.apache.org/proper/commons-io/download_io.cgi
解压后的jar文件还有servlet jar文件都放入到D:apache-tomcat-7.0.57lib 和
D:Program FilesJavajdk1.7.0_45jrelibext
开始开发
fileupload_demo01.html:
<html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <form action="fileupload_demo01.jsp" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"><br> 照片:<input type="file" name="pic"><br> <input type="submit" value="上传"> <input type="reset" value="重置"> </form> </body> </html>
上传步骤:
1. 创建磁盘工厂:DiskFileItemFactory factory=new DiskFileItemFactory();
2. 创建处理工具: ServletFileUpload upload=new ServletFileUpload(factory);
3. 设置上传文件大小: upload.setFileSizeMax(3145728);
4. 接收全部内容: List<FileItem> items=upload.parseRequest(request);
fileupload_demo01.jsp:
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% DiskFileItemFactory factory = new DiskFileItemFactory() ; ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上传3M List<FileItem> items = upload.parseRequest(request) ; // 接收全部内容 Iterator<FileItem> iter = items.iterator() ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表单控件的名称 %> <ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4> <% if(!item.isFormField()){ // 不是普通文本 String fileName = item.getName() ; // 取得文件的名称 String contentType = item.getContentType() ; // 文件类型 long sizeInBytes = item.getSize() ; %> <li>上传文件名称:<%=fileName%> <li>上传文件类型:<%=contentType%> <li>上传文件大小:<%=sizeInBytes%> <% } else { String value = item.getString() ; %> <li>普通参数:<%=value%> <% } %> </ul> <% } %> </body> </html>
批量上传:
<html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <form action="fileupload_demo02.jsp" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"><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>
获取;
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ 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="cn.mldn.lxh.util.*"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% DiskFileItemFactory factory = new DiskFileItemFactory() ; factory.setRepository(new File(this.getServletContext().getRealPath("/") + "uploadtemp")) ; // 更准确的说是一个临时文件 ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上传3M List<FileItem> items = upload.parseRequest(request) ; // 接收全部内容 Iterator<FileItem> iter = items.iterator() ; IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr()) ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表单控件的名称 %> <ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4> <% if(!item.isFormField()){ // 不是普通文本 File saveFile = null ; InputStream input = null ; OutputStream output = null ; input = item.getInputStream() ; output = new FileOutputStream(new File(this.getServletContext().getRealPath("/")+"upload"+File.separator+its.getIPTimeRand()+"."+item.getName().split("\.")[1])) ; int temp = 0 ; byte data[] = new byte[512] ; while((temp=input.read(data,0,512))!=-1){ output.write(data) ; // 分块保存 } input.close() ; output.close() ; } else { String value = item.getString() ; %> <li>普通参数:<%=value%> <% } %> </ul> <% } %> </body> </html>
此种处理方法有问题:
无法准确取得参数,无法取得一组参数,所有上传文件都需要依次判断,不能一次性批量保存,解决方案如下:
把FileUpload包装一下,FileUploadTools类:
fileupload_demo03.html:
<html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <form action="fileupload_demo03.jsp" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"><br> 兴趣:<input type="checkbox" name="inst" value="Swing">游泳 <input type="checkbox" name="inst" value="Song">唱歌 <input type="checkbox" name="inst" value="Run">跑步<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_demo03.jsp:
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ 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="cn.mldn.lxh.util.*"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% FileUploadTools fut = new FileUploadTools(request,3*1024*1024,this.getServletContext().getRealPath(".")+"uploadtemp") ; String name = fut.getParameter("uname") ; String inst[] = fut.getParameterValues("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> <% Iterator<String> iter = all.iterator() ; while(iter.hasNext()){ %> <img src="../upload/<%=iter.next()%>"> <% } %> </body> </html>