SpringMVC文件上传下载
文件上传的流程:
前台要求:
1、提交方式必须是post
2、input类型必须是file类型
3、还要加一个重要表单参数:encType属性值为:multipart/form-data
<form action="/system/slide/save" method="post" class="form-horizontal" id="saveForm" enctype="multipart/form-data">
<input type="hidden" name="id" id="fomHide">
<div class="form-group row">
<label for="file" class="control-label col-md-3">选择</label>
<div class="col-md-9">
<input id="input" class="form-control" type="file" name="file" >
</div>
</div>
<div class="form-group row">
<label for="enable" class="control-label col-md-3" >是否启用</label>
<div class="col-md-9">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" checked="checked" id="enable" name="enable" value="1">启用
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="enable" value="0">禁用
</label>
</div>
</div>
</div>
</form>
后台接收文件参数:
使用Multpartfile接收文件
注:要和前台的name名称一致,否则不饿能上传
@RequestMapping("/save")
@ResponseBody
public OptionResult save(Slide slide,MultipartFile file,HttpServletRequest request){
try {
sSrvice.save(slide,file,request);
return new OptionResult();
} catch (Exception e) {
e.getMessage();
return new OptionResult(false, "保存失败");
}
}
multipart/form-data表示提交的数据,以多段(一个表单项就是一个数据段)的形式进行拼接,以二进制流的形式发送给服务器
服务器配置:
springMVC核心配置文件配置一个文件上传解析器
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
上传核心:需要依赖commons-fileupload.jar和commons-io
后台在文件上传的时候,应该优先判断上传的文件是否存在,和要上传的文件夹是否已经生成,保证在动态的情况下,服务器也能够将文件成功上传
@Override
public void save(Slide slide, MultipartFile file, HttpServletRequest request)
throws IOException {
// 保存修改涉及文件上传
// 判断文件对象是否为空
// 文件上传操作
String path = request.getServletContext().getRealPath("/upload");
File file2 = new File(path);
if (file != null) {
// 判断上传的位置是否存在
if (!file2.exists()) {
file2.mkdirs();
}
// 获得输入流
InputStream in = file.getInputStream();
String sName = file.getOriginalFilename();
// 获得文件后缀
String suffix = sName.substring(sName.lastIndexOf("."));
System.out.println(suffix);
long millis = System.currentTimeMillis();
// 新的文件名字
String newStringFileName = millis + suffix;
// 将新名字设置到对象中
slide.setName(newStringFileName);
// 新建文件对象
File file3 = new File(file2, newStringFileName); // 输出的位置文件对象
FileOutputStream on = new FileOutputStream(file3);
// 将路径设置到对象中
slide.setPath("/upload/" + newStringFileName);
// 上传核心
IOUtils.copy(in, on);
on.close();
in.close();
}
文件上传管理:可能会重新上传文件,如果是这样,那么我们就应该先将已有的源文件删除掉,在进行上传更新数据,不删除原来的文件,事件久了数据量大了操作频繁之后,服务器内部就会数据堆积,容易崩塌
,修改的时候也要注意sql的动态拼接问题,避免内部错误
<update id="update">
update t_slide set
<if test="name != null and !''.equals(name.trim())">
name = #{name},path=#{path},
</if>
createDate=#{createDate},enable=#{enable}
where id = #{id}
</update>
文件下载,和上传大致上一致的,只是要注意下载文件中文名不显示的问题,还要设置响应头信息,告诉浏览器,是需要进行下载操作
大概思路:浏览器发送请求,告诉服务器到底要下载哪一个文件,然后,服务器读取需要下载的文件内容,然后回传,在之前做一些设置
response.setHeader(“Content-Disposition”, “attachment; fileName=1.jpg”);
这个响应头告诉浏览器。这是需要下载的。而 attachment 表示附件,也就是下载的一个文件。fileName=后面, 表示下载的文件名