文件上传
单文件下载
三步搞定单文件下载
- 在配置文件里面配置好CommonsMultipartResolver类
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>//设置上传文件的最大size
<property name="defaultEncoding" value="UTF-8"/>
</bean>
需要下载commons-fileupload-1.3.3.jar和commons-io-2.6.jar,下载网址为
点我
2. jsp只需要一个file框,这里我展示一个比较简陋的jsp的部分内容
<form action="/CSDNWEB_war_exploded/fileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/><br>
<input type="submit" value="提交"><br>
</form>
3.写好相应的Conntroller类,我这里展示比较通用的代码,RequestParam里面的required属性如果表示true,传入的参数里面就必须有file,这里的文件对象我们使用Spring里面的MultipartFile ,因为里面帮我们包装好了许多好用的方法,这里就说我在下面使用的一些
file.getOriginalFilename():获取原来的文件名
file.transferTo();将文件保存到一个目录文件中
单文件上传就这样配置完成了
@RequestMapping("/fileUpload")
public String fileUpLoad(@RequestParam(value = "file",required = false) MultipartFile file,HttpServletRequest request, ModelMap modelMap){
String filepath = request.getSession().getServletContext().getRealPath("upload");
// 这个是你需要保存的文件路径,你们可以修改为自己的,如果不修改就需要在服务器发布的文件夹里寻找
String filename = file.getOriginalFilename();
// 这个是文件名,我这里选择原本文件上传的名字,读者也可以修改
if (filename==null){
filename = "未命名文件";
}
File targetFile = new File(filepath,filename);
if (!targetFile.exists()){
targetFile.mkdirs();
}
try {
file.transferTo(targetFile);
}catch (IOException e){
e.printStackTrace();
System.out.println("文件转换失败");
}
return "success";
}
多文件上传
- 第一步和单文件一样
- jsp,就在file里面加入一个multple属性,这里还是展示
<form action="/CSDNWEB_war_exploded/manyFileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple="multiple"><br><br>
<input type="submit" value="上传">
</form>
- 相应的controller类,代码可能有冗余哈,请见谅
@RequestMapping("/manyFileUpload")
public String manyFileLoad(@RequestParam(value = "files",required = false) List<MultipartFile> files,
HttpServletRequest request){
if (!files.isEmpty()&&files.size()>0){
for (MultipartFile file:files){
String oriFileName = file.getOriginalFilename();
String tarpath = request.getServletContext().getRealPath("/upload");
//这个是你想要上传文件夹的地址,需要自行修改
File filepath = new File(tarpath);
if (!filepath.exists()){
filepath.mkdirs();
}
String newFileName = "加上你自己想要的前缀"+"_"+ UUID.randomUUID() +oriFileName+oriFileName;
try {
file.transferTo(new File(tarpath,newFileName));
}catch (IOException e){
e.printStackTrace();
System.out.println("文件转换失败");
return "error";
}
}
return "success";
}
else {
System.out.println("文件为空");
return "error";
}
}
文件下载
- 我们这里选择使用一个url表示一个下载请求url:/download?filename=文件名 表示一个下载请求,所以我们写一个Controller处理download请求,ResponseEntity这个对象也是Spring替我们包装好了,用于我们浏览器处理我们文件的相关信息,操作代码如下:
public ResponseEntity<byte[]> download(@RequestParam(value = "filename") String filename, HttpServletRequest request){
String path = request.getServletContext().getRealPath("/upload");
// 这是你服务器放资源文件的地址,需要自行修改
File file = new File(path+File.separator+filename);
HttpHeaders httpHeaders = new HttpHeaders();
try {
// 这里解决部分浏览器下载带有中文名称的文件的时候失败的问题
String downFileName = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
httpHeaders.setContentDispositionFormData("attachment",downFileName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
try {
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}