ajax异步刷新上传文件

jquery插件实现ajax异步上传文件


现在很多系统中都有着异步刷新上传的功能需求,甚至更是有业务需要支持续传,目前h5中有FormData函数实现文件异步提交,但现阶段还主要存在很多项目使用不了h5的这个函数,所以今天我以servlet为例实现一个异步上传功能,借用到的工具包为apache的commons-fileupload-1.3.2.jar,若使用其他框架则有其他的文件封装工具,如:struts中的FormFile对象、springmvc中MultipartFile对象都支持着对文件的封装及解析功能,而且都有着比较良好的封装。


废话不多说,以下是我的实现过程: 


jquery引入:

//在jsp的头部引入jquery文件和jquery.form文件,jquery.form为上传插件,切记不要将位置调换,否则无法正确加载js
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="js/jquery.form.js"></script>

接下来为script部分:

<script type="text/javascript">  
  	function doUpload(formId,commitUrl){
  		var fileName=$("#fileName").val();
  		if(fileName==''){
  			alert("请选择需要导入的文件!");
  			return false;
  		}
  		$("#"+formId).ajaxSubmit({
  			url:commitUrl,
  			type:"post",
  			contentType:"application/x-www-form-urlencorded;charset=utf-8",//防止乱码
  			dataType:"json",
  			success:function(data){
  				alert(data);
  			},
  			error:function(){
  				alert('上传文件出现错误,请检查格式是否正确,或联系技术人员');
  			}
  		});
    }
</script>

form表单部分:

<span style="white-space:pre">	</span><form action="/工程/asyc_upload" name="mainFrm" id="mainFrm" enctype="multipart/form-data" method="post">
		 <input type="file" name="fileName" id="fileName"/>
		 <input type="hidden" name="userName" id="userName" value="userName">
		 <input type="submit" name="submit" value="submit提交">
		 <input type="button" value="ajax提交" οnclick="doUpload('mainFrm','/工程/asyc_upload');">
<span style="white-space:pre">	</span></form>

以上部分为前端代码,主要是对form表单的提交,然后后台进行request接收及参数处理


以下为后台java部分

package com.unionpay.acp.demo;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Asyc_upload extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1960824567575955421L;
	private String filePath;    // 文件存放目录  
    private String tempPath;    // 临时文件目录  
 
    // 初始化  
    public void init(ServletConfig config) throws ServletException{  
        super.init(config);  
        // 从配置文件中获得初始化参数  
        filePath = config.getInitParameter("filepath");  
        tempPath = config.getInitParameter("temppath");  
 
        ServletContext context = getServletContext();  
 
        filePath = context.getRealPath(filePath);  
        tempPath = context.getRealPath(tempPath);  
        System.out.println("文件存放目录、临时文件目录准备完毕 ...");  
    }
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		req.setCharacterEncoding("UTF-8");
        PrintWriter pw = resp.getWriter(); 
        try{
			DiskFileItemFactory diskFactory=new DiskFileItemFactory();
			 // threshold 极限、临界值,即硬盘缓存
	        diskFactory.setSizeThreshold(4 * 1024);  
	        // 设置临时问及目录 当文件尺寸大于setSizeThreshold方法设置的临界值时将文件以临时文件保存  
	        diskFactory.setRepository(new File(tempPath));  
	        //apache上传文件jar
	        ServletFileUpload upload = new ServletFileUpload(diskFactory);  
	        // 设置允许上传的最大文件大小 4M  
	        upload.setSizeMax(4 * 1024 * 1024);  
	        // 解析HTTP请求消息头  
	        List<FileItem> fileItems = upload.parseRequest(req); 
	        Iterator<FileItem> iter = fileItems.iterator();
	        while(iter.hasNext()) {  
	            FileItem item = (FileItem)iter.next();  
	            if(item.isFormField()){  
	                System.out.println("处理表单内容 ...");  
	                processFormField(item, pw);  
	            }else{  
	                System.out.println("处理上传的文件 ...");  
	                processUploadFile(item, pw);  
	            } 
	        }
        }catch (Exception e) {
        	e.printStackTrace();
		}
        pw.print("{}");
	}
	
	/**
	 * 处理表单内容
	 * @param item
	 * @param pw
	 * @throws Exception
	 */
    private void processFormField(FileItem item, PrintWriter pw)  
        throws Exception {  
        String name = item.getFieldName();  
        String value = item.getString();          
        System.out.println(name + " : " + value + "\r\n");  
    }  
    
    /**
     * 处理上传的文件  
     * @param item
     * @param pw
     * @throws Exception
     */
    private void processUploadFile(FileItem item, PrintWriter pw)  
        throws Exception  {  
        // 此时的文件名包含了完整的路径,得注意加工一下  
        String filename = item.getName();         
        System.out.println("完整的文件名:" + filename);  
        int index = filename.lastIndexOf("\\");  
        filename = filename.substring(index + 1, filename.length());  
        long fileSize = item.getSize();  
        if("".equals(filename) && fileSize == 0)  {             
            System.out.println("文件名为空 ...");  
            return;  
        }  
        File uploadFile = new File(filePath + "/" + filename);  
        item.write(uploadFile);  
        System.out.println(filename + " 文件保存完毕 ...");  
        System.out.println("文件大小为 :" + fileSize + "\r\n");  
    } 
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
}


web.xml中主要配置容器的映射及初始化参数

  <servlet>
    <servlet-name>asyc_upload</servlet-name>
    <servlet-class>com.unionpay.acp.demo.Asyc_upload</servlet-class>
    <strong><init-param></strong>
    <param-name>filepath</param-name>
    <param-value>uploadFile</param-value>
    <strong></init-param>
    <init-param></strong>
    <param-name>temppath</param-name>
    <param-value>temp</param-value>
    <strong></init-param></strong>
  </servlet>
  <servlet-mapping>
    <servlet-name>asyc_upload</servlet-name>
    <url-pattern>/asyc_upload</url-pattern>
  </servlet-mapping>


目录结构(resource部分),temp为临时文件存放处,uploadFile为上传文件存放目录


演示界面如下:(submit和ajax实现都成功)亲测



最后回顾下,主要部分为jsp界面提交部分,及dopost接受,如果能正确流化文件,则上传成功,可先使用submit提交,然后再测试ajax访问,开发查错会更快

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君哥聊编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值