MultipartRequest上传文件

  1. http://zhanghy0525-126-com.iteye.com/blog/1452465  

 

MultipartReques类主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multipart/form-data"格式,以二进制形式提交数据,提交方式为post方式。 

 

[html]  view plain copy
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  2. <html>   
  3.   <head>   
  4.     <title>upload.html</title>   
  5.     <meta http-equiv="content-type" content="text/html; charset=GBK">   
  6.   </head>   
  7.   <body>   
  8. <form name="UploadForm" enctype="multipart/form-data" method="post" action="test">   
  9. 用户名:<input type="text" id="userName" name="userName"/><br>   
  10.     密码:<input type="password" id="password" name="password" /><br>   
  11. <input type="file" name="File1" size="20" maxlength="20"><br>   
  12. <input type="file" name="File2" size="20" maxlength="20"><br>   
  13. <input type="submit"value="上传">   
  14. </form>   
  15.   </body>   
  16. </html>   

再写一个servlet用于处理请求,代码如下: 
[java]  view plain copy
  1. package test;   
  2.   
  3. import java.io.File;   
  4. import java.io.IOException;   
  5. import java.util.Enumeration;   
  6.   
  7. import javax.servlet.ServletException;   
  8. import javax.servlet.http.HttpServlet;   
  9. import javax.servlet.http.HttpServletRequest;   
  10. import javax.servlet.http.HttpServletResponse;   
  11.   
  12. import com.oreilly.servlet.MultipartRequest;   
  13.   
  14. @SuppressWarnings("serial")   
  15. public class TestServlet extends HttpServlet {   
  16. @Override   
  17. public void service(HttpServletRequest request, HttpServletResponse response)   
  18. throws ServletException, IOException {   
  19. MultipartRequest mr=null;   
  20. //用来限制用户上传文件大小的   
  21. int maxPostSize = 1 * 100 * 1024 * 1024;   
  22. //第一个参数为传过来的请求HttpServletRequest,   
  23. //第二个参数为上传文件要存储在服务器端的目录名称   
  24. //第三个参数是用来限制用户上传文件大小   
  25. //第四个参数可以设定用何种编码方式来上传文件名称,可以解决中文问题   
  26. mr = new MultipartRequest(request, "E:\\zhang", maxPostSize, "GBK");   
  27. //传回所有文件输入类型的名称   
  28. Enumeration files = mr.getFileNames();   
  29. String fileName = "";   
  30. String filePath="";   
  31. while (files.hasMoreElements()) {   
  32. fileName = (String) files.nextElement();   
  33. System.out.println("FileName============"+fileName);   
  34. //用此方法得到上传文件的真正的文件名,这里的fileName指文件输入类型的名称   
  35. filePath = mr.getFilesystemName(fileName);   
  36. System.out.println("FilePath============"+filePath);   
  37. //此方法得到一个文件对象,代表储存在服务器上的fileName文件   
  38. File f = mr.getFile(fileName);   
  39. if (null == f)   
  40. throw new ServletException("file is not exist");   
  41. }   
  42. //可以取得请求参数的名称   
  43. Enumeration enum1=mr.getParameterNames();   
  44. while (enum1.hasMoreElements()) {   
  45. String s=(String)enum1.nextElement();   
  46. System.out.println(s);   
  47. String[] str=mr.getParameterValues(s);   
  48. for (int i=0;i<str.length;i++){   
  49. System.out.println(str[i]);   
  50. }   
  51. }   
  52. }   
  53.   
  54. }   


得到的结果如下:

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无刷新上传文件

开源中国
开源中国
发表于 2014-09-03 20:29:18

1.jsp代码:(    注意这里的jquery只能用1.2.1,我试了1.3.2会报错:(         )

<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<link rel="stylesheet"href="../js/ajaxfileupload/ajaxfileupload.css"type="text/css"title='main' media="screen"/>


<script src="../js/json.js"type="text/javascript"></script>
<script src="../js/ajaxfileupload/jquery.js"type="text/javascript"></script>
<script src="../js/ajaxfileupload/ajaxfileupload.js"type="text/javascript"></script>

<title>haha</title>
</head>
<body>
<form action=""enctype="multipart/form-data">

<input type="file"name="upload"id="upload"/><input type="button"value="upload"οnclick="javascript:upload_files();"/><p/>
</form>
<img id="loading"src="../images/loading.gif"style="display:none;"/>
</body>

<script>




function upload_files(){


$("#loading")


.ajaxStart(function(){



$(this).show();


})


.ajaxComplete(function(){



$(this).hide();


});





$.ajaxFileUpload


(



{




url:'../demo/test!ajax_upload?id=1',




secureuri:false,




fileElementId:'upload',




dataType: 'json',




success: function (data, status)
{
 alert( data.resultText);
 alert( data.extra );
},
 error: function (data, status, e)
{
alert(e);
}




}


)

}


</script>

</html>

 

 

action代码:

package com.prl.action.demo;

import java.io.File;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.convention.annotation.ParentPackage;
import org.json.JSONObject;
import org.springside.modules.web.struts2.Struts2Utils;

import com.prl.action.BaseAction;
import com.prl.common.CommonUtil;
import com.prl.helper.JsonResult;

@ParentPackage(value="noneedlogin")
public class TestAction extends BaseAction{

private File upload;

private String uploadFileName;

private String uploadUploadContentType;

private Long id ;

public String ajax_demo(){


HttpServletRequest request = Struts2Utils.getRequest();


CommonUtil.printAllParam(request);





System.out.println("jsonString==============="+request.getParameter("toJSONString"));





JsonResult jsonResult = new JsonResult("0","成功");


Struts2Utils.renderText(new JSONObject(jsonResult).toString());





return null;

}



public String ajax_upload(){


System.out.println("id========="+id);


System.out.println("uploadFileName========="+uploadFileName);


JsonResult jsonResult = new JsonResult("0","成功");





//前台的ajax.upload.js框架可能有bug,导致这个地方必须用renderHtml,不能用其它的


Struts2Utils.renderHtml(new JSONObject(jsonResult).toString());


//Struts2Utils.renderText(new JSONObject(jsonResult).toString());


//Struts2Utils.renderJson(jsonResult);


return null;

}


public File getUpload() {


return upload;

}


public void setUpload(File upload) {


this.upload = upload;

}


public String getUploadFileName() {


return uploadFileName;

}


public void setUploadFileName(String uploadFileName) {


this.uploadFileName = uploadFileName;

}


public String getUploadUploadContentType() {


return uploadUploadContentType;

}


public void setUploadUploadContentType(String uploadUploadContentType) {


this.uploadUploadContentType = uploadUploadContentType;

}


public Long getId() {


return id;

}


public void setId(Long id) {


this.id = id;

}
}
--------------------------------------------------------------------------------------------------------------------------------------------

首先说下使用的框架和插件:

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;

	}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值