EasyUI file-box+SpringMVC 单个或多个图片上传

时间:2022-08-28 20:23:12

Do not go gentle into that good night

网上关于图片上传的文章有很多,这篇文章介绍的是使用EsayUI和SpringMVC结合,通过EsayUI的file-box 控件实现单个或者多个图片简单的上传功能,本文没有涉及图片回显;

首先介绍软件环境,最开始任务下来的时候不会这个功能,上网进行了大量查找;最后实现了发现实际上代码并不复杂,但由于网上很多博文都没有仔细介绍软件环境,而实际开发中很多问题和环境或者版本有很大关系;

导致作为新人的我在搭建环境上花费了近于开发三倍多的时间,故此之后每篇博文都尽量在最开始给出开发环境,便于以后的阅读和使用方便;

开发环境:

Eclipse 4.3  
jdk1.7.0_72
apache-maven-3.0.4
apache-tomcat-7.0.53
spring-mvc-4.0
spring-beans-4.0
mybatis-3.2.8
oracle 11.2.0.3.0

所需jar包:

commons-io-2.4
commons-fileupload-1.3

关于文件上传的思路都大同小异,主要思路就几步:

  • 页面控件获取用户上传文件;
  • 后台接收文件,一般以流形式获取;
  • 对文件进行操作(保存到指定位置或者进行解析,本文中只涉及保存)

关于接收文件流这部分,网上有很多方法;

先说明一下:
本文中在后台使用了一个pojo对象的MultipartFile属性作为前台传入文件流的接收端;


下面我按照上面的步骤进行代码的说明;
首先要做的是将需要的jar包导入到工程中,这个不做赘述;

配置SpringMVC:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
<property name="defaultEncoding" value="UTF-8"/>
</bean>

这个节点还可以对上传文件的大小做限定,具体可以查看文末reference;
然后是页面的上传控件配置;

页面代码-JSP:

<form id="rundApplyFrom" method="post" enctype="multipart/form-data"> 
<tr id="trIdCard">
<td>msg:</td>
<td><input class="easyui-filebox" id="uploadId" name="sourceFile" style="width:200px"></td>
</tr>
</from>

<!-- 这里的name属性需要和controller方法中用于接收上传文件Bean中的byte[]字段名字相同 -->

像注释中提到的,这里name用于后台配置jopo来接收前台上传的文件的属性;
需要和属性name保持一致,后面java代码部分会详说;
页面代码-JS

function uplodad(
$('#fromNameId')
.form({
url:'controllerurl',
onSubmit: function(){
//uploda before something

},success:function(data){
//upload after something

},error:function(date){
$.messager.alert(data.errormsg);
}
});

$('#fromNameId').submit();
);

用于接收文件的pojo:

public class PojoBeanClassName implements Serializable {

private String prosn ;
private String applyid;
private byte[] annex ;
private Object content;
private MultipartFile[] sourceFile;

// sourceFile geter, seter

本文中需求是多文件上传,所以这里使用了一个MultipartFile数组来接收文件;

注意:前面页面代码的注释中提到的,这个MultipartFile属性的名字需要和页面上file-box控件中的name属性相同,这样在提交表单的时候才能确保SpringMVC能将文件接收到后端;

Controller中接收文件上传的方法;

public void uplodaApplyFile(AReFundApplyProcess arProcess, AReFundApply aRefundApply){

MultipartFile[] uploadfile=arProcess.getSourceFile();
//这里用于获取前台传入Bean中Byte字段中的流;
//因为案例中是多文件上传,所以是数组;

InputStream fileIs= null;
aRefundApply.setOrderno(arProcess.getProsn());

try {
if(uploadfile != null&& uploadfile.length>0){
for (int i = 0; i < uploadfile.length; i++) {
MultipartFile file=uploadfile[i];
fileIs= file.getInputStream();
byte[] b = FileCopyUtils.copyToByteArray(fileIs);
if(b.length>0){
arProcess.setAnnex(b);
aReFundApplyCheckService.insertAReFundApplyProcess(arProcess);
}
}
}
} catch (IOException e) {
log.error("上传文件异常...",e);
}
}

这里的setAnnex() 方法将转换完成的文件流存入了jopo中的bayte[]类型的字段;
由于byte[]可以和file类型或者strem类型任意转换,后期就可以对进行需要的处理了;

【Reference Material】
- http://blog.csdn.net/songanling/article/details/38951013


【End】