2.文件上传
======
(1)导入文件上传的依赖包
commons-fileupload
commons-fileupload
1.3.3
javax.servlet
javax.servlet-api
4.0.1
(2)配置springmvc核心配置文件
参数分析:
属性 | 描述 |
maxUploadSize | 上传文件最大长度(以字节为单位) |
maxInMemorySize | 缓存中的最大尺寸 |
defaultEncoding | 默认编码格式 |
resolveLazily | 推迟文件解析,以便在Controller中捕获文件大小异常 |
注意:bena的id必须为:multipartResolver , 否则上传文件会报400的错误!
(3)编写前端页面
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
(4)编写Controller
MultipartFile接口中的主要方法
方法 | 说明 |
byte[]getBytes() | 以字节数组的形式返回文件的内容 |
String getContentType() | 返回文件的内容类型 |
InputStream getInputStream() | 读取文件内容,返回一个InputStream流 |
String getName() | 获取多部件form表单的参数名称 |
String getOriginalFilename() | 获取上传文件的初始化名 |
long getSize() | 获取上传文件的大小,单位是字节 |
boolean isEmpty() | 判断上传的文件是否为空 |
void transferTo(File file) | 将上传文件保存到目标目录下 |
package com.yixin.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@Controller
public class FileController {
//@RequestParam(“file”) 将name=file控件得到的文件封装成CommonsMultipartFile 对象
//批量上传CommonsMultipartFile则为数组即可
@RequestMapping(“/upload”)
public String fileUpload(@RequestParam(“file”) CommonsMultipartFile file , HttpServletRequest request) throws IOException {
//获取文件名 : file.getOriginalFilename();
String uploadFileName = file.getOriginalFilename();
//如果文件名为空,直接回到首页!
if (“”.equals(uploadFileName)){
return “redirect:/index.jsp”;
}
System.out.println("上传文件名 : "+uploadFileName);
//上传路径保存设置
String path = request.getServletContext().getRealPath(“/upload”);
//如果路径不存在,创建一个
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
System.out.println(“上传文件保存地址:”+realPath);
InputStream is = file.getInputStream(); //文件输入流
OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流
//读取写出
int len=0;
byte[] buffer = new byte[1024];
while ((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
return “redirect:/index.jsp”;
}
}
(5)配置tomcat,启动运行
由于我们在配置文件中配置了文件的内存是小于10M,故选择相应的文件,点击upload便会下载到相应的地址。
我们也可以使用CommonsMultipartFile的transferTo进行保存地址。
(可以看到这种方式来保存比较简洁)
@RequestMapping(“/upload2”)
public String fileUpload2(@RequestParam(“file”) CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//上传路径保存设置
String path = request.getServletContext().getRealPath(“/upload”);
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
//上传文件地址
System.out.println(“上传文件保存地址:”+realPath);
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(new File(realPath +“/”+ file.getOriginalFilename()));
return “redirect:/index.jsp”;
}
前端更改提交地址,同样可以到达保存的目的。
3.文件下载
=========
(1)编写Controller
@RequestMapping(value=“/download”)
public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
//要下载的图片地址
String path = request.getServletContext().getRealPath(“/upload”);
String fileName = “logo.jpg”;
//1、设置response 响应头
response.reset(); //设置页面不缓存,清空buffer
response.setCharacterEncoding(“UTF-8”); //字符编码
response.setContentType(“multipart/form-data”); //二进制传输数据
//设置响应头
response.setHeader(“Content-Disposition”,
“attachment;fileName=”+ URLEncoder.encode(fileName, “UTF-8”));
File file = new File(path,fileName);
//2、 读取文件–输入流
InputStream input=new FileInputStream(file);
//3、 写出文件–输出流
OutputStream out = response.getOutputStream();
byte[] buff =new byte[1024];
int index=0;
//4、执行 写出操作
while((index= input.read(buff))!= -1){
out.write(buff, 0, index);
out.flush();
}
out.close();
input.close();
return null;
}
(2)编写前端
(3)运行
点击下载后,可以发现浏览器会下载logo.jpg这个文件。