springmvc实现文件上传和下载
程序员文章站
2022-04-30 22:42:56
...
springmvc实现文件上传的步骤:
同时,要求form表单必须给定一个属性:enctype="multipart/form-data"
<form action="uc/adduser" method="post" enctype="multipart/form-data">
<p>
用户名:<input type="text" name="loginname" id="loginname" />
</p>
<p>
密码:<input type="text" name="loginpwd" id="loginpwd" />
</p>
<p>
头像:<input type="file" name="pic" id="pic" />
</p>
<p>
<input type="submit" value="注册" />
</p>
</form>
2.在pom.xml文件中,添加文件上传的第三方工具:
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
<!-- 文件上传依赖(该依赖下载时,commons-io-2.2.jar也随着添加到依赖中) -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
3.在app-springmvc.xml配置文件中,准备上传操作的对象:CommonsMultipartResolver
在这个对象中,我们可以对文件大小,编码方式等进行设定
<!-- 图片上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--每个文件上传大小-->
<property name="maxUploadSizePerFile" value="102400000"></property>
</bean>
4.在控制器中,通过@RequestParam MultipartFile pic这种方式,来接收页面传递的文件,这里,参数的名字必须与页面上file组件的name属性值一致
此时,在控制器中,已经能够正常地接收页面上传的文件了,下一步,只需要把接收的这个文件,保存到服务器的硬盘上即可(在项目根目录下创建一个upload文件夹存储上传的文件)
控制器代码:
@RequestMapping(value = "adduser", method = RequestMethod.POST)
public String addUser(Users users,
@RequestParam MultipartFile pic, HttpServletRequest request,
Model model) {
// 原始上传文件名字
String filename = pic.getOriginalFilename();
// 文件类型
String contentType = pic.getContentType();
InputStream is = null;
OutputStream os = null;
// 上传目录的绝对路径
String realpath = request.getSession().getServletContext()
.getRealPath("/upload");
// 得到一个随机的字符串作为上传文件的新名字(防止文件因名字相同而覆盖)
String uuid = UUID.randomUUID().toString();
// 获得文件的后缀名
String endname = filename.substring(filename.lastIndexOf("."),
filename.length());
// 要把文件输出到硬盘上有两种方式
// 方式一:自己写字节流 并通过边读边写操作完成输出
// try {
// is = pic.getInputStream();
// os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
// byte[] b = new byte[1024];
// int len = is.read(b);
// while (len != -1) {
// os.write(b, 0, len);
// len = is.read(b);
// }
// } catch (IOException e1) {
// e1.printStackTrace();
// } finally {
// try {
// os.flush();
// os.close();
// is.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// 方式二、通过commons-io包提供的工具来完成拷贝
try {
is = pic.getInputStream();
os = new FileOutputStream(new File(realpath + "/" + uuid + endname));
FileCopyUtils.copy(is, os);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.flush();
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 上传完成后,还需要把文件路径和名字保存到user对象中,然后把user对象的信息,保存到数据库中
// 下次能够根据数据库的记录,来找到对应的文件
users.setPicpath(uuid + endname);
boolean flag = userServiceImpl.addUser(users);
if (flag) {
model.addAttribute("mypic", uuid + endname);
return "add_suc";
}
return "index";
}
SpringMVC 文件下载核心代码:
页面中将需要下载的文件的名字参数传输到控制器中,在控制器中的代码如下(文件保存在项目根目录的upload文件夹里面):
/**
* 实现下载的步骤: 1、需要把数据以流的形式响应到页面 2、需要在页面上打开Content-disposition=attachment
*
* @return
*/
@RequestMapping(value = "downloadfile")
public ResponseEntity<byte[]> downloadFile(String mypicname,
HttpServletRequest request) {
// 读取文件保存的根位置
String realPath = request.getSession().getServletContext()
.getRealPath("/upload");
File file = new File(realPath + "/" + mypicname);
HttpHeaders header = new HttpHeaders();
header.setContentDispositionFormData("attachment", mypicname);
ResponseEntity<byte[]> re = null;
try {
re = new ResponseEntity<byte[]>(
FileUtils.readFileToByteArray(file), header, HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
}
return re;
}