文件上传功能
一、文件上传的配置及相关步骤
首先我们先导入相关的依赖包,我们要在maven的pom.xml文件中完成依赖包的配置:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
之后我们就可以创建一个类了,负责完成文件上传的功能。
public class uploadController {
private static final String UPLOAD_PATH="F:/upload";
//如何去实现参数的封装【上传的时候如何给出判断和验证】
// 需要CommonsMultipartResolver
@RequestMapping("/upload.do")
public ModelAndView upload(@RequestParam("myPic") MultipartFile myPic) throws IOException {
// 这里的 myPic 必须与那个jspwe文件的name名一样,不然收不到参数
// CommonsMultipartResolver ,配置springMVC容器
//1、文件在服务器上的储存【文件保存到当前服务器的什么地方】
// File file = new File(文件地址+文件名+后缀名);
UUID uuid = UUID.randomUUID();//生成新的名字
SimpleDateFormat cuurent = new SimpleDateFormat("yyyy-MM-dd");
String time = cuurent.format(new Date());
long uid = System.currentTimeMillis();
// 取出后缀名 ,下面的是后去图片名称
String filename = myPic.getOriginalFilename();
String suffix= filename.substring(filename.lastIndexOf('.'));
//下面是文件创建
File file = new File(UPLOAD_PATH+"/"+time+"_"+uid+suffix);
myPic.transferTo(file);
///2、文件地址的回显【保存成功后,查看当前文件在服务器的名字地址】
ModelAndView mv = new ModelAndView();
mv.setViewName("upload");
//上传成功就了就可以取出一个名字
mv.addObject("upload_file_path",file.getName());
//给出页面的跳转
return mv;
}
补充:这里的MultipartFile 的对象名必须要和对应的jsp文件中name名要一致,这里的UUID就是用来生成一串随机数对上传的文件在进行一次命名后存储到本地文件中。
二、 图片的回显
关于jsp中img标签图片的回显问题,因为我们的文件是存储在自己的本地路径而不是在项目中所以会导致图片的回显失败,因此解决方法有三种。
- 通过更改Tomcat中的server.xml配置文件,在中间添加一个虚拟路径来完成图片的回显 路径在 tomcat的conf文件夹里面的server.xml文件,写在HOST标签里面即可。
<!-- 虚拟路径 所指向的本地路径 重加载-->
<Context path="/upload" docBase="F:\upload\" reloadable="true" crossContext="true" />
之后还要在自己的IEDA项目里,更改一下tomcat的配置,我们要在Tomcat的Deployment里面添加一个 External Source 找到自己的本地路径,之后再将他的Apllication Context 该改成虚拟路径即可。虚拟路径和server配置里面的path要对应。
对应的jsp里面的img标签的写法如下:
<img src="/upload/${upload_file_path}">
就行了。
- 通过io流的方法将读取过来的图片直接写入到页面中,具体代码如下:
` @RequestMapping("/upload2.do")
public String upload2(HttpServletResponse response) throws IOException {
// 这里的paths是文件的本地路径
InputStream fis = new FileInputStream(paths);
OutputStream os = response.getOutputStream();
response.setContentType("img/JPEG");
try {
int i = 0;
//这里的by大小随意,这里就是写入文件流
byte[] by = new byte[1024 * 1024];
while ((count = fis.read(by)) != -1) {
os.write(by, 0, i);
}
// 写入之后后进行刷新
os.flush();
// 关闭流
fis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null)
os.close();
if (fis != null)
fis.close();
return null;
}
}`
之后我们就要在对应的jsp文件中的img标签中的src里面写上
<img src="${pageContext.request.contextPath}/uploadController/upload2.do">
路径就是你对应自己所写的,就行了。
- 还有一种就是,我们直接将文件存储至该项目的文件夹下面即可。