在maven中,首先导入commons-fileupload和commons-io的包,我用的是1.3的fileupload的包和2.4的io的包
<commons-fileupload.version>1.3</commons-fileupload.version>
<commons-io.version>2.4</commons-io.version>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
然后需要在SpringMVC做配置,用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file,我这里就简单的配置一下上传的最大问文件的大小和编码而已
<!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>
接下面就是前段的代码了:
由于上传所遵循的传输协议要求特殊,所以要在前端提交表单的时候添加一个属性 enctype即encoding type ,可以用个这个链接了解为什么要加这个属性 https://blog.csdn.net/qq_32003379/article/details/91362750
文件上传的内容在正文,必须使用POST请求而不是GET,为啥呢?
简单来说:
首先:Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
其次:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度限制,只能传递大约1024字节.
再次:Post就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。
<form id="inputForm" action="${ctx}/dataImport/upload" method="post" class="form-horizontal"
enctype="multipart/form-data">
<div class="control-group">
<label class="control-label">选择文件:</label>
<div class="controls">
<input type="file" name="file" id="file" accept=".zip" style="width:330px" class="required">
<input id="btnSubmit" class="btn btn-primary" type="submit" value="上传"/>
<input id="btnDown" class="btn btn-primary" type="button" value="下载模板" onclick="window.location.href = '${ctx}/dataImport/downTemplate'"/>
</div>
</div>
</form>
控制类部分的,我们使用MultipartFile去做接收,我这里不写@RequestParam这个注解,因为我的file和前端的file是想对应的,所以不需要写。
/**
* 上传数据
* @param file
* @param model
* @return
*/
@RequiresPermissions("porg:dataImport:upload")
@RequestMapping(value = "upload", method=RequestMethod.POST)
public String upload(MultipartFile file, Model model) {
String log= "";
//上传数据
try {
//1,获取原始文件名
String originalFilename = file.getOriginalFilename();
//2,截取源文件的文件名前缀,不带后缀
String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
//3,加工处理文件名,原文件加上时间戳
String newFileNamePrefix = fileNamePrefix + System.currentTimeMillis();
//4,得到新文件名
String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));
/*
* 这里就可以写你自己想要的业务逻辑了
* */
log = dataImportService.upload(file).getMessage();
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("log", log);
this.addMessage(model, "查看导入信息!");
return "modules/org/porg/dataImportIndex";
}
以上的就是上传的一些简单的代码,关于Service层的,就不写了,这个需要根据相关的业务去写。
对于MultipartFile有一些常用的方法
String getContentType()//获取文件MIME类型
InputStream getInputStream()//后去文件流
String getName() //获取表单中文件组件的名字
String getOriginalFilename() //获取上传文件的原名
long getSize() //获取文件的字节大小,单位byte
boolean isEmpty() //是否为空
void transferTo(File dest) //保存到一个目标文件中。