springMVC的文件上传

springMVC的文件上传

能帮我解释一下这段上传文件的代码吗?

@PostMapping("/upload")
public String upload(HttpServletRequest request, @ModelAttribute User user, Model model) throws IOException {
 if (!user.getImage().isEmpty()) {
   String realPath = request.getServletContext().getRealPath("/images");//这是获取那个路径
   System.out.println(realPath);
   String filename = user.getImage().getOriginalFilename();
   System.out.println(filename);
   File file = new File(realPath,filename);//这是创建文件吗?第一个参数代表什么,第二个代表什么
   if (!file.getParentFile().exists()){//getParentFile()是什么?和getParent()有啥区别
       file.getParentFile().mkdirs();
   }
   user.getImage().transferTo(new File(file+File.separator+filename));
   model.addAttribute("filename",user.getImage().getOriginalFilename());
   System.out.println("上传路径:"+file+File.separator+filename);
     return "uploadInfo";//不需要解释
 }
 return "error";//不需要解释
}

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,request.getServletContext().getRealPath("/images");

request.getServletContext() 获取到的是Servlet容器对象,而getRealPath("/images") 获取实际路径,也就是当前项目路径与images的对应路径,比如:

http://img1.sycdn.imooc.com//climg/5ee045610909c4cd08410216.jpg

如上所示,它并不会判断images是否存在,所以对应在下面的代码中有对它的判断

http://img1.sycdn.imooc.com//climg/5ee0459e0995a0ab06670109.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

好帮手慕小班 2020-06-09 19:10:21

同学你好,1、request.getServletContext().getRealPath("/images");

request.getServletContext() 获取的是Servlet容器对象,相当于tomcat容器。

getRealPath("images") 获取实际路径,所以这个代码返回的是实际的images的路径,也就是images的当前绝对项目路径。

    2、new File(realPath,filename),其实就是创建文件流(File文件流),可以获取文件属性或者说是对文件进行操作。

public File(String parent,String child) --> File的构造方法
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
如果 parent 为 null,则创建一个新的 File 实例,这与调用以给定 child 路径名字符串作为参数的单参数 File 构造方法效果一样。

参数:
parent - 父路径名字符串
child - 子路径名字符串

    3、getParentFile()的返回值是File型的,而getParent() 的返回值是String型的;

返回File类型,为文件类型,可以进行文件的操作,比如调用创建子文件夹的方法:getParentFile().mkdirs();而返回String类型,为字符串类型,只能获取到当前的路径名,不能进行其他操作。

    所以我们常用的返回文件所在文件夹路径方法的是getParentFile()。

综上所述:

public String upload(HttpServletRequest request, @ModelAttribute User user, Model model) throws IOException {
  if (!user.getImage().isEmpty()) {  // 如果文件不为空,写入上传路径
    String realPath = request.getServletContext().getRealPath("/images");//获取当前相对的images路劲
    System.out.println(realPath);
    String filename = user.getImage().getOriginalFilename();//返回原始文件名
    System.out.println(filename);
    File file = new File(realPath,filename);//通过File的构造方法,创建文件流
    if (!file.getParentFile().exists()){//判断路径是否存在,如果不存在就创建一个
        file.getParentFile().mkdirs(); 
    }
    //通过transferTo方法直接写文件
    ser.getImage().transferTo(new File(realPath+File.separator+filename));
    model.addAttribute("filename",user.getImage().getOriginalFilename());
    System.out.println("上传路径:"+file+File.separator+filename);
      return "uploadInfo";//不需要解释
  }
  return "error";//不需要解释
}

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 cccca #1
    images那个文件夹一开始是没有的,怎么获取得到它的路径
    2020-06-09 20:24:31
提问者 cccca 2020-06-09 17:37:17

user.getImage().transferTo(new File(file+File.separator+filename));这句打错了

正确

ser.getImage().transferTo(new File(realPath+File.separator+filename));

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师