- http://zhanghy0525-126-com.iteye.com/blog/1452465
MultipartReques类主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multipart/form-data"格式,以二进制形式提交数据,提交方式为post方式。
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>upload.html</title>
- <meta http-equiv="content-type" content="text/html; charset=GBK">
- </head>
- <body>
- <form name="UploadForm" enctype="multipart/form-data" method="post" action="test">
- 用户名:<input type="text" id="userName" name="userName"/><br>
- 密码:<input type="password" id="password" name="password" /><br>
- <input type="file" name="File1" size="20" maxlength="20"><br>
- <input type="file" name="File2" size="20" maxlength="20"><br>
- <input type="submit"value="上传">
- </form>
- </body>
- </html>
再写一个servlet用于处理请求,代码如下:
- package test;
- import java.io.File;
- import java.io.IOException;
- import java.util.Enumeration;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.oreilly.servlet.MultipartRequest;
- @SuppressWarnings("serial")
- public class TestServlet extends HttpServlet {
- @Override
- public void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- MultipartRequest mr=null;
- //用来限制用户上传文件大小的
- int maxPostSize = 1 * 100 * 1024 * 1024;
- //第一个参数为传过来的请求HttpServletRequest,
- //第二个参数为上传文件要存储在服务器端的目录名称
- //第三个参数是用来限制用户上传文件大小
- //第四个参数可以设定用何种编码方式来上传文件名称,可以解决中文问题
- mr = new MultipartRequest(request, "E:\\zhang", maxPostSize, "GBK");
- //传回所有文件输入类型的名称
- Enumeration files = mr.getFileNames();
- String fileName = "";
- String filePath="";
- while (files.hasMoreElements()) {
- fileName = (String) files.nextElement();
- System.out.println("FileName============"+fileName);
- //用此方法得到上传文件的真正的文件名,这里的fileName指文件输入类型的名称
- filePath = mr.getFilesystemName(fileName);
- System.out.println("FilePath============"+filePath);
- //此方法得到一个文件对象,代表储存在服务器上的fileName文件
- File f = mr.getFile(fileName);
- if (null == f)
- throw new ServletException("file is not exist");
- }
- //可以取得请求参数的名称
- Enumeration enum1=mr.getParameterNames();
- while (enum1.hasMoreElements()) {
- String s=(String)enum1.nextElement();
- System.out.println(s);
- String[] str=mr.getParameterValues(s);
- for (int i=0;i<str.length;i++){
- System.out.println(str[i]);
- }
- }
- }
- }
得到的结果如下:
16:36:16,346 INFO [STDOUT] FileName============File2
16:36:16,346 INFO [STDOUT] FilePath============新建 文本文档.txt
16:36:16,346 INFO [STDOUT] FileName============File1
16:36:16,346 INFO [STDOUT] FilePath============test.txt
16:36:16,346 INFO [STDOUT] password
16:36:16,346 INFO [STDOUT] zhy
16:36:16,346 INFO [STDOUT] userName
16:36:16,346 INFO [STDOUT] zhang
若出现异常如下,则是maxPostSize 设置太小,文件太大
exception :
java.io.IOException: Posted content length of 785 exceeds limit of 1
com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:172)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:222)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:173)
test.TestServlet.service(TestServlet.java:22)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
若出现异常如下,则提交方式应该为post提交,或编码形式为enctype="multipart/form-data"
exception:
java.io.IOException: Posted content type isn't multipart/form-data
com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:166)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:222)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:173)
test.TestServlet.service(TestServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
关于此类的API详看
http://www.servlets.com/cos/javadoc/com/oreilly/servlet/MultipartRequest.html
ajax实现无刷新上传
ssh3中利用ajaxfileupload无刷新上传文件
--------------------------------------------------------------------------------------------------------------------------------------------
首先说下使用的框架和插件:
struts1.3 jQuery1.3 ajaxupload.3.2.js(一个JQuery的插件,实现Ajax上传的效果)
COS(O’relly的一个性能很棒的上传组件)
jsp页面:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ include file="../../common/taglibs.jsp" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script type="text/javascript" src="${basePath }/script/jquery.js"></script> <script type="text/javascript" src="${basePath }/script/ajaxupload.3.2.js"></script> <title>Ajax文件上传示例</title> <style type="text/css"> #loading,ol{ font-size:14px; display:none; color:orange; display:none; } ol{ display:block; } </style> <script type="text/javascript"> $(function(){ new AjaxUpload("#fileButton",{ action:"${basePath}/file.do?method=upload", autoSubmit:true, name:"myfile", onSubmit:function(file, extension){ if (extension && /^(pdf|jpg|png|jpeg|gif)$/.test(extension)) { $("#loading").html('<img src="${basePath}/images/loading.gif">'); $("#loading").show(); $("#fileButton").attr("disabled","disabled"); } else { $("#loading").html("你所选择的文件不受系统支持"); $("#loading").show(); return false; } }, onComplete:function(file, extension){ $("#loading").html("文件上传成功"); $("#loading").show(); $("#fileButton").removeAttr("disabled"); } }); new Ajax_upload('#button3', { action: '${basePath}/file.do?method=upload', name: 'myfile', autoSubmit:true, onComplete : function(file, extension){ $('<li></li>').appendTo($('.files')).text(file); } }); }); </script> </head> <body> <input type="button" value="请选择您的照片" id="fileButton"/> <div id="loading"><img src="${basePath}/images/loading.gif"></div> <hr/> <form action="#" method="post"> <input id="button3" type="file" /> <p>上传成功的文件有:</p> <ol class="files"></ol> <p> <input class="submit" type="submit" value="表单提交"/> </p> </form> </body> </html> StrutsAction代码:
package com.kay.crm.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import org.springframework.stereotype.Controller; import com.kay.common.util.CosUtil; @Controller("/file") public class FileUploadAction extends DispatchAction { public ActionForward upload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String fileName = CosUtil.upload(request); System.out.println(fileName); return null; } }
Cos的工具类:
package com.kay.common.util; import java.io.File; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import com.oreilly.servlet.MultipartRequest; public class CosUtil { @SuppressWarnings({ "deprecation", "unchecked" }) public static String upload(HttpServletRequest request) throws IOException { //存绝对路径 //String filePath = "C://upload"; //存相对路径 String filePath = request.getRealPath("/")+"upload"; File uploadPath = new File(filePath); //检查文件夹是否存在 不存在 创建一个 if(!uploadPath.exists()) { uploadPath.mkdir(); } //文件最大容量 5M int fileMaxSize = 5*1024*1024; //文件名 String fileName = null; //上传文件数 int fileCount = 0; //重命名策略 RandomFileRenamePolicy rfrp=new RandomFileRenamePolicy(); //上传文件 MultipartRequest mulit = new MultipartRequest(request,filePath,fileMaxSize,"UTF-8",rfrp); String userName = mulit.getParameter("userName"); System.out.println(userName); Enumeration filesname = mulit.getFileNames(); while(filesname.hasMoreElements()){ String name = (String)filesname.nextElement(); fileName = mulit.getFilesystemName(name); String contentType = mulit.getContentType(name); if(fileName!=null){ fileCount++; } System.out.println("文件名:" + fileName); System.out.println("文件类型: " + contentType); } System.out.println("共上传" + fileCount + "个文件!"); return fileName; } }
Cos上传组件用到的重命名策略类:
package com.kay.common.util; import java.io.File; import java.util.Date; import com.oreilly.servlet.multipart.FileRenamePolicy; public class RandomFileRenamePolicy implements FileRenamePolicy { public File rename(File file) { String body=""; String ext=""; Date date = new Date(); int pot=file.getName().lastIndexOf("."); if(pot!=-1){ body= date.getTime() +""; ext=file.getName().substring(pot); }else{ body=(new Date()).getTime()+""; ext=""; } String newName=body+ext; file=new File(file.getParent(),newName); return file; } }