springmvc实现文件blob二进制文件上传

springmvc实现文件blob二进制文件上传到数据库

1、整体实现思路

1)数据库字段类型设置为blob
2)前台ajax请求
3) 后台使用MultipartFile

2、代码实现

前端:

//开始提交数据
        				var fileName2 ='';
        				var fileArrs = [];
        	    		for(var i=0;i<fileArr.length;i++){
        	    			var elementSuffix = extname_id(fileArr[i].id);//获取文件位置
        	    			var textVal = document.getElementById("filetext_"+elementSuffix).value;//新文件名称
        	    			var filesuffix = extname(fileArr[i].files[0].name);//获取文件后缀名
        	    			var filename = textVal+"."+filesuffix;//拼接成完整的文件名
        	    			fileName2 = textVal;
        	    			//生成新文件
        	    			var file = new File([fileArr[i].files[0]], filename, {
        	    				type: fileArr[i].files[0].type
        	    			});
        	    			
        	    			formDataStart.append('file',file); // 传入文件
        	    			formDataStart.append('fjmc',textVal);
        	    		}
        	    		formDataStart.append('fjlx',fjtype);
        	    		formDataStart.append('sszxmid',_objId);
        	    		formDataStart.append('xmlx',xmlx);
$.ajax({
    	    			 	url: path,
    	    	            type: "post",
    	    	            data: formDataStart,
    	    	            async: false,
    	    	            contentType:false, //- 必须false才会自动加上正确的Content-Type
    	    	            processData: false, //- 必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
    	    	            success : function(res) {
    	    	            	
    	    	            	if(res.successful) {
    	    	            		mx.indicate("info", "上传成功");
    	    	            		var win = me.tpHSplit.parent;
    	    	        			if($instanceOf(win, mx.windows.Window)) {
    	    	        				var gzlx = me.tabControl.selection.name;
    	    	        				if('jg'==gzlx){
    	    	        					me.jgGrid.load();	
    	    	        				}else{
    	    	        					me.dxGrid.load();
    	    	        				}
    	    	        				win.hide();
    	    	        			}
    	    	                }else{
    	    	                	mx.indicate("info", res.msg);
    	    	                }
    	    	            }
        	    		 });

后端:

/**
* zsk 实体类
* request 
**/
	public Map<String, Object> uploadFile(zsk zsk,HttpServletRequest request) throws IOException {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		for(int i = 0; i<zsk.getFile().length;i++){ // 可以上传多个文件,遍历
			MultipartFile mfile1 = zsk.getFile()[i];
			
			if (mfile1==null || mfile1.isEmpty()){ // 空文件判断
				resultMap.put("successful", false);
				resultMap.put("msg", "文件上传失败!");
			}
			
			System.out.println("name: " + mfile1.getOriginalFilename() + "  size: " + mfile1.getSize()); 
			String urlname = UUID.randomUUID().toString() + "_" + mfile1.getOriginalFilename();
			String base64Str = null;
			try {
				
				base64Str = Base64Utility.encode(mfile1.getBytes()); // 转base64
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
			FileOutputStream fos = null;
			try {
				resultMap.put("successful", true);
				resultMap.put("stream", base64Str);
				// 转二进制存入数据库blo字段
				byte[] byteFile = Base64Utility.decode(base64Str); 
				resultMap.put("realFileName",mfile1.getOriginalFilename());
				String scSql = "insert into t_jgdx_xmfjb(obj_id,fjmc,scsj,wjlx,sfcg,wjlxbm,sszxmid,realname,xmlx,wjlj,WJ)"+
	 " values(sys_guid(),?,sysdate,?,?,?,?,?,?,?,?)";
				hibernateDao.executeSqlUpdate(scSql,new Object[]{zsk.getFjmc(),zsk.getFjlx(),'0',zsk.getFjlx(),zsk.getSszxmid(),mfile1.getOriginalFilename(),zsk.getXmlx(),"/app/ywfz/jgdx/jpg/"+ urlname,byteFile});
				resultMap.put("successful", true);
				resultMap.put("msg", "文件上传成功!");
			} catch (Exception e) {
				e.printStackTrace();
				resultMap.put("successful", false);
				resultMap.put("msg", "文件上传失败!");
			} finally {
			}	
		}


		return resultMap;
	}

3、常见问题总结

1、后台接收不到文件
解决办法:放在实现类里

public class zsk {
	...
	private MultipartFile[] file;

	public MultipartFile[] getFile() {
		return file;
	}

	public void setFile(MultipartFile[] file) {
		this.file = file;
	}
}

2、前端请求注意以下设置
contentType:false, //- 必须false才会自动加上正确的Content-Type
processData: false, //- 必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
3、后台接收注意加注解@ResponseBody

@RequestMapping(value = "/uploadFile",method = RequestMethod.POST)
    @ResponseBody
	public Map<String, Object> uploadFile(zsk zsk, HttpServletRequest request) {
    	try{
    		return uplodaBizc.uploadFile(zsk, request);
		}catch(Exception e){
			throw new RestClientException("方法异常",e);
		}
	}


版权声明:本文为qq_38138791原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。