JavaWEB+Ajax实现文件上传

准备:我们需要找一张绿色或者其它颜色的背景图,放在photo文件夹里就好哈,然后加jar:common-io和commo-fileupload就可以哈

创建progress.css文件:

.pro{

  height:15px;

  width:500px;

  background: #FFFFF0;

  border: 1px solid #8FBC8F;

  margin: 0;

  padding: 0;

  display:none;

  position: relative;

  left:25px;

  float:left;

}

创建uploadAjax.js

function go(){
 f1.submit();
 document.getElementById("pro").style.display="block";
 document.getElementById("prop").style.display="";
 timer=setInterval("getP()",50);

}

var xmlHttpRequest;
function getP(){

 if(window.XmlHttpRequest){
  xmlHttpRequest=new XmlHttpRequest();
 }else{
  xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
 } 

 xmlHttpRequest.onreadystatechange=callBack;
 url="GetProgressServlet";
 xmlHttpRequest.open("post",url,true);

 xmlHttpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 xmlHttpRequest.send("&timeStamp="+(new Date()).getTime()); 

}
//回调函数
function callBack(){

 if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200){ 

  result=xmlHttpRequest.responseText;
  var result=result.replace(/(^\s*)|(\s*$)/g, "");
  var res=result.split(",");
  var flag=res[1];
  var per=parseInt(res[0]);
  var err=res[2];
  document.getElementById("imgpro").style.width=per*5+"px";
  document.getElementById("prop").innerHTML=per+"%";
  if(flag=="OK"){
   window.clearInterval(timer);
   alert("上传成功!");
   document.getElementById("pro").style.display="none";
   document.getElementById("prop").innerHTML="";
   f1.reset();
  }
  if(err!=""||err.length>0){
   window.clearInterval(timer);
   alert(err);
  }
  if(flag==null){
   window.clearInterval(timer);
  }
 }
}

调用和引入

<link rel="stylesheet" type="text/css" href="css/progress.css">

<script type="text/javascript" src="js/uploadAjax.js" charset="UTF-8"></script>

<div class="am-g">
      <div class="am-u-sm-12" align="left">
    	<div class="am-form-group">
		<form action="<%=basePath %>UploadSpotImgServlet" name="f1" id="f1" method="post" enctype="multipart/form-data" target="if">
	 		<div class="field">
                <a class="button input-file" href="javascript:void(0);">+ 浏览文件<input size="30" type="file" name="logo" data-validate="required:请选择上传文件,regexp#.+.(jpg|jpeg|png|gif)$:只能上传jpg|gif|png格式文件" /></a>
             </div>
             <br>
             <input type="reset" name="res1" value="重置"  class="am-btn am-btn-primary" />
             <input type="submit" name="but1" value="提交" onclick="go();" class="am-btn am-btn-primary" />
		</form><br>
		<div id="pro" class="pro" align="left" style="height:1px;width:600px;">
 		<img alt="" src="photo/progress.png" width="0px" id="imgpro">
		</div>
  		<span id="prop" style="width:15px;height:15px;display: none;">0%</span>
  		<br><br>
		<iframe id="if" name="if" src="" style="display: none"></iframe>

	   </div>
     </div>
   </div>

创建UploadSpotImgServlet

public class UploadSpotImgServlet extends HttpServlet {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	private String fileName;

	private File tempFile;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码格式为utf-8
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out1 = response.getWriter();

		request.setCharacterEncoding("UTF-8");
		//获取session,保存进度和上传结果,上传结果初始值为NOK,当为Ok表示上传完成
		HttpSession session=request.getSession();
		session.setAttribute("prog", "0");
		session.setAttribute("result", "NOK");
		session.setAttribute("error", "");
		String error="";
		//给上传的文件设一个最大值,这里是不得超过50MB
		int maxSize=50*1024*1024;
		//创建工厂对象和文件上传对象
		DiskFileItemFactory factory=new DiskFileItemFactory();
		ServletFileUpload upload=new ServletFileUpload(factory);
		try {
			//解析上传请求
			List items=upload.parseRequest(request);
			Iterator itr=items.iterator();

		   while(itr.hasNext()){
			    FileItem item=(FileItem)itr.next();
			    //判断是否为文件域
			    if(!item.isFormField()){
			     if(item.getName()!=null&&!item.getName().equals("")){
				      //获取上传文件大小和文件名称
				      long upFileSize=item.getSize();
				      fileName=item.getName();
				      if(upFileSize>maxSize){
				       error="您上传的文件太大了,请选择不超过50MB的文件!";
				       break;
				      }
				      //此时文件暂存在服务器的内存中,构造临时对象
				      tempFile=new File(fileName);
				      //指定文件上传服务器的目录及文件名称
				      File file=new File("D:\\MyEclipse\\workspace\\TourismSystemServer\\WebRoot\\source\\images",tempFile.getName());
				      //构造输入流读文件
				      InputStream is=item.getInputStream();
				      int length=0;
				      byte[] by=new byte[1024];
				      double persent=0;
				      FileOutputStream fos=new FileOutputStream(file);
				      PrintWriter out=response.getWriter();
				      while((length=is.read(by))!=-1){
				       //计算文件进度
				       persent+=length/(double)upFileSize*100D;
				       fos.write(by, 0, length);
				       session.setAttribute("prog", Math.round(persent)+"");
				       Thread.sleep(10);
				      }
				      fos.close();
				      Thread.sleep(1000);
			     	}else{
			     		error="没选择上传文件!";
			     	}
			    }
		   }

		  Constant.ImgPath.path = "/source/images/"+tempFile.getName();
		  //System.out.println(Constant.ImgPath.path);
		   response.sendRedirect(Constant.WEB_URL_ADDSPOTINFO);

		} catch (Exception e) {
			e.printStackTrace();
			error="上传文件出现错误:"+e.getMessage();
		}
		if(!error.equals("")){
			session.setAttribute("error", error);
		}else{
			session.setAttribute("result", "OK");
		}

		out1.flush();
		out1.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

ok,这样我们就可以上传文件到我们制定的文件夹里哦,还有结合Ajax,就不会出现页面刷新的情况了哦!



时间: 2024-10-17 02:45:49

JavaWEB+Ajax实现文件上传的相关文章

ajax+spring文件上传

1.js代码 $(function(){ $('#upfileID').change(function(){ $.ajaxFileUpload({ url: '/upload/image', type: 'post', secureuri: false, //一般设置为false fileElementId: 'upfileID', // 上传文件的id属性名 dataType: 'text', //返回值类型,一般设置为json.application/json success: functi

javaWeb中的文件上传下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

ajax提交表单、ajax实现文件上传

ajax提交表单.ajax实现文件上传,有需要的朋友可以参考下. 方式一:利用from表单的targer属性 + 隐藏的iframe 达到类似效果, 支持提交含有文件和普通数据的复杂表单 方式二:使用jquery的$.ajax({..}), 支持提交普通表单,但不支持含有文件的复杂表单; ($.post 或 $.get底层用的都是$.ajax) 方式三:使用jquery插件ajaxFileUpload.js, 支持上传文件,但不支持提交表单 方式四:使用jquery.from.js,支持提交同时

7 款基于 JavaScript/AJAX 的文件上传插件

本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1.  jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby on Rails.Java.Node.js.Go等)一起使用,支持标准的HTML表单文件上传. 2.  Pixelco

基于jsp的AJAX多文件上传的实现

最近的项目开发中,遇到了一个多文件上传的问题,即在不刷新页面的情况下,上传多个文件至服务器.现总结分享如下: 本文主要采用了基于jsp的ajax,jquery,servlet等技术. 1.upload.jsp 点击上传时,调用对应的fileupload函数,通过ajax将文件异步传送到servlet中处理.注意在文件上载时,所使用的编码类型应当是"multipart/form-data",它既可以发送文本数据,也支持二进制数据上载. <%@ page language="

JavaWeb学习总结——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

基于jquery的Ajax实现 文件上传

---------------------------------------------------------------遇到困难的时候,勇敢一点,找同学朋友帮忙,找导师求助. Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML".即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据). 同步交互:客户端发出一个请

AJAX与文件上传

一.ajax ajax(Asynchronous JavaScript And XML):异步JavaScript和XML,即使用JavaScript语句与服务器进行异步交互,传输的数据为XML(也可以是json数据).实际上就是在JavaScript语句里用ajax可以向服务器发送请求. 两大特点: 1,异步交互 2,页面局部刷新 语法: 基于jQuery:<script>$('.cc').click(function(){ #当我们点击'.cc'这个类的时候就会触发ajax请求 $.aja

JavaWeb项目实现文件上传动态显示进度

很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之后网页就跳转了.后来我学习到了Ajax,我知道了浏览器可以异步的发送响应,这时我又有新的疑问,那就是在我上传一些文件的时候,那些网站的上传进度是怎么做到的,因为servlet直到上传完成之后才完成响应. 最近我们的项目中有一个地方中需要用到一个功能,当用户点击一个处理按钮时,前台会实时的显示后台处理