**自己对于SSM文件上传的一些心得**
刚开始的时候也是在网上寻找一些简单的案例,可能我的这篇文章不是最好的,但是这些都是我自己慢慢的摸索以及自己的尝试的一些心得,希望对各位有所帮助。
其实文件的上传也不是特别的难,可能针对初学者来说是有一些难以理解,但是只要自己认真的分析一些,其实逻辑并不是特别的难。
首先做这个案例需要准备两个jar,我用的是maven,具体依赖如下:
commons-io
commons-io
2.6
commons-fileupload
commons-fileupload
1.3.3
上面两个jar的依赖便是准备工作了,接下来便是上传的页面了,相信这个不会难倒小伙伴们,在此就直接把代码给大家,不做过多的解释了。
pageEncoding="UTF-8"%>
文件上传下载method="post" enctype="multipart/form-data">
选择文件:
type="submit" value="上传">
多说一句这行代码的作用便是让浏览器解析jstl的代码,有些小伙伴们编写了jsp代码运行的时候如果从session中取数据有可能就是不会解析,从而取不到自己想要的数据。
下面便是运行界面的效果图
前面一些相信对于大家来说就是洒洒水了,关键的便是在控制层编写相应的逻辑代码了。
首先我们便是要得到文件的名称
//获取文件名称
String fileName = file.getOriginalFilename();
获得了文件的名称之后,如果你需要给文件一个新的名称可以使用UUID时间戳的方式给它一个新的名称,案例中没有使用,如果感兴趣的话,我也把代码给大家。
//新文件名
String newFileName = UUID.randomUUID() + fileName;
得到了文件名称后,便是需要解决上传文件路径的问题了,最简单的便是自己设置一个绝对路径,我在本案例中便是使用的绝对路径具体代码如下:
//设置上传路径
String path = "D:/test1/";
若是想要放在项目路径下的话只需要修改自己相应的代码即可:
//获得项目的路径
ServletContext sc =request.getSession().getServletContext();//上传位置
String path = sc.getRealPath("/files") + "/"; //设定文件保存的目录
注意:在你路径下必须是“/”结尾,若是没有这个"/"到时候效果可能不会如你所想,想要实验的小伙伴们可以去试一试,在这里我便不演示了。
接下来的便是文件上传的核心了:文件上传主要是利用了流的思想。流便是:输入流和输出流(不要怪我啰嗦,主要是让一些不太清楚的小伙伴们理解,大神忽略即可)。
首先是判断下自己所设置的路径是否存在,如果没有判断的话,要是路径不存在,那么你的后台便会报错,具体的错误那就靠各位小伙伴们自己去尝试了,我就不在这里演示了,你只有自己尝试才会更加的注意这个问题,等下次报了相同的异常的时候自己就知道如何去解决。具体代码如下:
//文件上传
File f = newFile(path);//判断路径是否存在,不存在则创建
if(!f.exists()){
f.mkdirs();
}
f.exists是一个判断这个路径是否存在的,返回的结果是一个Boolean值,如果存在返回true不存在则但会false,!便是对其取反,(就是原来是true的变成false,false变成true);f.mkdirs();便是创建对应文件。如果文件位置不存在的话,f.exists便是false ,然后对其取反便为true便会执行if里面的语句,从而创建对应的文件路径。
接下来便是处理文件上传了。
//判断上传文件是否为空
if(!file.isEmpty()){try{
FileOutputStream fos= new FileOutputStream(path +fileName);
InputStream in=file.getInputStream();int a = 0;if((a = in.read())!=-1){
fos.write(a);
}
in.close();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
首先便是判断下用户上传的文件是否为空(就是用户是否上传了文件),若是你文件都没有选择便点击上传的话我们后台也没有必要去处理他了吧。
用户上传文件之后
这行代码就是开启一个输出流,输出的路径便是之前我们设置的路径,注意的是这里需要处理一下异常,我这里是直接捕获一个最大的异常。
FileOutputStream fos = new FileOutputStream(path + fileName);
这个便是得到上传文件的输入流
InputStream in = file.getInputStream();
下面的代码是通过一个变量a来接收输入流,一边读,然后输出流一边的写出去,当读完之后变量a的值便为-1,所以这便成了一个判断的依据,当变量a为-1的时候也就代表已经读完了,而且同时也写完了
int a = 0;if((a = in.read())!=-1){
fos.write(a);
}
当读完之后小伙伴们记得把输入流和输出流关闭哦,如果不关闭的话会造成资源浪费的,而且还需注意的是大家要按照先开后关的原则哦。
in.close();
fos.close();
接下来的便是完整的代码。
@Controller
@RequestMapping("/file")public classFile2Controller {
@PostMapping("/load")publicString fileload(MultipartFile file, HttpServletRequest request) {//获取文件名称
String fileName =file.getOriginalFilename();//设置上传路径
String path = "D:/test1/";//文件上传
File f = newFile(path);//判断路径是否存在,不存在则创建
if(!f.exists()){
f.mkdirs();
}//判断上传文件是否为空
if(!file.isEmpty()){try{
FileOutputStream fos= new FileOutputStream(path +fileName);
InputStream in=file.getInputStream();int a = 0;if((a = in.read())!=-1){
fos.write(a);
}
in.close();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}return null;
}
}
效果图如下:
以上便是个人对于文件上传的一些心得,可能写的不是特别的好,只是希望对小伙伴们有一些帮助,特别是对于一些萌新们,只希望能够帮助你们就好。(最后希望大神们勿喷)