当前位置: 代码迷 >> Ajax >> SpringMVC + ajaxfileupload的多文件下传
  详细解决方案

SpringMVC + ajaxfileupload的多文件下传

热度:1052   发布时间:2012-12-14 10:33:08.0
SpringMVC + ajaxfileupload的多文件上传

    最近做一个springmvc ajax多文件上传,倒腾了下,查阅了部分资料搞定了!现在分享:

   1.Spring mvc

       a.xml配置:

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
        <!-- set the max upload size1MB   1048576     -->
        <property name="maxUploadSize">
            <value>52428800</value>
        </property>
        <property name="maxInMemorySize">
            <value>2048</value>
        </property>
    </bean>
      b. 服务器端接收解析
        public void imgUpload(
		MultipartHttpServletRequest multipartRequest,
		HttpServletResponse response) throws Exception {
		response.setContentType("text/html;charset=UTF-8");
		Map<String, Object> result = new HashMap<String, Object>();
                //获取多个file
		for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) {
			String key = (String) it.next();
			MultipartFile imgFile = multipartRequest.getFile(key);
			if (imgFile.getOriginalFilename().length() > 0) {
				String fileName = imgFile.getOriginalFilename();
                                //改成自己的对象哦!
				Object obj = new Object();
				//Constant.UPLOAD_GOODIMG_URL 是一个配置文件路径
				try {
					String uploadFileUrl = multipartRequest.getSession().getServletContext().getRealPath(Constant.UPLOAD_GOODIMG_URL);
					File _apkFile = saveFileFromInputStream(imgFile.getInputStream(), uploadFileUrl, fileName);
					if (_apkFile.exists()) {
						FileInputStream fis = new FileInputStream(_apkFile);
					} else
						throw new FileNotFoundException("apk write failed:" + fileName);
					List list = new ArrayList();
					//将obj文件对象添加到list
					list.add(obj);
					result.put("success", true);
				} catch (Exception e) {
					result.put("success", false);
					e.printStackTrace();
				}
			}
		}
		String json = new Gson().toJson(result,
				new TypeToken<Map<String, Object>>() {
				}.getType());
		response.getWriter().print(json);
	}

        //保存文件
	private File saveFileFromInputStream(InputStream stream, String path,
			String filename) throws IOException {
		File file = new File(path + "/" + filename);
		FileOutputStream fs = new FileOutputStream(file);
		byte[] buffer = new byte[1024 * 1024];
		int bytesum = 0;
		int byteread = 0;
		while ((byteread = stream.read(buffer)) != -1) {
			bytesum += byteread;
			fs.write(buffer, 0, byteread);
			fs.flush();
		}
		fs.close();
		stream.close();
		return file;
	}

2.关于前端代码

a.修改ajaxfileupload.js

  先到官网下载该插件.

  将源文件的createUploadForm的代码替换如下:

createUploadForm: function(id, fileElementId, data)
		{
			//create form	
	    	var formId = 'jUploadForm' + id;
	    	var fileId = 'jUploadFile' + id;
	    	var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');	
	    	if (data) {
				for ( var i in data) {
					jQuery(
							'<input type="hidden" name="' + i + '" value="'
									+ data[i] + '" />').appendTo(form);
				}
			}
	    	for (var i = 0; i < fileElementId.length; i ++) {
				var oldElement = jQuery('#' + fileElementId[i]);
				var newElement = jQuery(oldElement).clone();
				jQuery(oldElement).attr('id', fileElementId[i]);
				jQuery(oldElement).attr('name', fileElementId[i]);
				jQuery(oldElement).before(newElement);
				jQuery(oldElement).appendTo(form);
			}
	    	//set attributes
	    	jQuery(form).css('position', 'absolute');
	    	jQuery(form).css('top', '-1200px');
	    	jQuery(form).css('left', '-1200px');
	    	jQuery(form).appendTo('body');
			return form;
	    }
第一步高定

b. 页面代码

html:

<input type="button"  value="添加附件" onclick="createInput('more');" />
<div id="more"></div>
js:这里可以专门写封装类,以及给file加onchange事件判断文件格式。由于时间有限,未修改
var count = 1;
/**
* 生成多附件上传框
*/
function createInput(parentId){
    count++;
    var str = '<div name="div" ><font style="font-size:12px;">附件</font>'+
    '   '+ '<input type="file" contentEditable="false" id="uploads' + count + '' +
    '" name="uploads'+ count +'" value="" style="width: 220px"/><input type="button"  value="删除" onclick="removeInput(event)" />'+'</div>';
    document.getElementById(parentId).insertAdjacentHTML("beforeEnd",str);
}
/**
* 删除多附件删除框
*/
function removeInput(evt, parentId){
   var el = evt.target == null ? evt.srcElement : evt.target;
   var div = el.parentNode;
   var cont = document.getElementById(parentId);       
   if(cont.removeChild(div) == null){
    return false;
   }
   return true;
}
下面是2个修改多file用的js,用于显示和删除,可以于上面的合并精简代码:

function addOldFile(data){
	var str = '<div name="div' + data.name + '" ><a href="#" style="text-decoration:none;font-size:12px;color:red;" onclick="removeOldFile(event,' + data.id + ')">删除</a>'+
    '   ' + data.name + 
    '</div>';
    document.getElementById('oldImg').innerHTML += str;
}

function removeOldFile(evt, id){
    //前端隐藏域,用来确定哪些file被删除,这里需要前端有个隐藏域
    $("#imgIds").val($("#imgIds").val()=="" ? id :($("#imgIds").val() + "," + id));
    var el = evt.target == null ? evt.srcElement : evt.target;
    var div = el.parentNode;
    var cont = document.getElementById('oldImg');    
    if(cont.removeChild(div) == null){
        return false;
    }
    return true;
}
ajax上传文件:
function ajaxFileUploadImg(id){
        //获取file的全部id
        var uplist = $("input[name^=uploads]");
	var arrId = [];
	for (var i=0; i< uplist.length; i++){
	    if(uplist[i].value){
	    	arrId[i] = uplist[i].id;
		}
        }
	$.ajaxFileUpload({
		url:'xxxxx',
		secureuri:false,
		fileElementId: arrId,  //这里不在是以前的id了,要写成数组的形式哦!
		dataType: 'json',
		data: {
                     //需要传输的数据
                },
		success: function (data){
		},
		error: function(data){
		}
	});
}

亲们,一个spingmvc +ajax多文件上传有搞定了,功能很简单,有问题联系本人


  相关解决方案