首先描述一下问题,弹簧引导使用的是内嵌的tomcat,所以不清楚文件上传到哪里去了,而且弹簧引导把静态的文件全部在启动的时候都会加载到类路径的目录下的,所以上传的文件不知相对于应用目录在哪,也不知怎么写访问路径合适,对于新手的自己真的一头雾水。
后面想起了官方的例子,没想到一开始被自己找到的官方例子,后面太依赖百度谷歌了,结果发现只有官方的例子能帮上忙,而且帮上大忙,直接上密码的代码
包你好; 进口静态org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; 进口静态org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; 进口java.io.IOException; 进口java.nio.file.Files; 进口java.nio.file.Paths; 进口java.util.stream.Collectors; 进口javax.servlet.http.HttpServletRequest; 进口org.slf4j.Logger; 进口org.slf4j.LoggerFactory; 进口org.springframework.beans.factory.annotation.Autowired; 进口org.springframework.core.io.ResourceLoader; 进口org.springframework.http.ResponseEntity; 进口org.springframework.stereotype.Controller; 进口org.springframework.ui.Model; 进口org.springframework.web.bind.annotation.PathVariable; 进口org.springframework.web.bind.annotation.RequestMapping; 进口org.springframework.web.bind.annotation.RequestMethod; 进口org.springframework.web.bind.annotation.RequestParam; 进口org.springframework.web.bind.annotation.ResponseBody; 进口org.springframework.web.multipart.MultipartFile; 进口org.springframework.web.servlet.mvc.support.RedirectAttributes; @ controller 公开课FileUploadController { 私有静态最终记录器日志=LoggerFactory.getLogger (FileUploadController.class); 公共静态最终字符串根=皍pload-dir”; 私人最终ResourceLoader ResourceLoader; @ autowired 公共FileUploadController (ResourceLoader ResourceLoader) { 这一点。resourceLoader=resourceLoader; } @RequestMapping(方法=RequestMethod。,价值=" https://www.yisu.com/") 公共字符串provideUploadInfo(模型模型)抛出IOException { 模型。addAttribute(“文件”,Files.walk (Paths.get(根) .filter(路径→! path.equals (Paths.get(根))) . map(路径→Paths.get(根).relativize(路径)) . map(路径→linkTo (methodOn (FileUploadController.class) .getFile (path.toString ())) .withRel (path.toString ())) .collect (Collectors.toList ())); 返回“uploadForm”; }//显示图片的方法关键匹配路径像localhost: 8080/b7c76eb3 - 5 - a67 - 4 - 18 - ae5c - 1642 af3f8746.png @RequestMapping(方法=RequestMethod。,价值=" https://www.yisu.com/{文件名:。+}”) @ResponseBody 公共ResponseEntity<& # 63;比;getFile (@PathVariable字符串文件名){ 尝试{ 返回ResponseEntity.ok (resourceLoader。getResource(“文件:”+路径。(根,文件名).toString ())); }捕捉(异常e) { .build返回ResponseEntity.notFound () (); } } & lt; strong>//上传的方法& lt;/strong> @RequestMapping(方法=RequestMethod。帖子,价值=" https://www.yisu.com/") 公共字符串handleFileUpload (@RequestParam MultipartFile文件(“文件”), RedirectAttributes RedirectAttributes HttpServletRequest请求){ System.out.println (request.getParameter(“成员”)); 如果(! file.isEmpty ()) { 尝试{ Files.copy (file.getInputStream(),路径。get(根,file.getOriginalFilename ())); redirectAttributes.addFlashAttribute(“信息”, “你成功上传”+ file.getOriginalFilename () +“!”); }捕捉(IOException | RuntimeException e) { redirectAttributes。addFlashAttribute(“信息”、“阳性率”上传+ file.getOriginalFilename() +”=比;“+ e.getMessage ()); } 其他}{ redirectAttributes。addFlashAttribute(“信息”,“未能上传”+ file.getOriginalFilename() +”,因为它是空的”); } 返回“重定向:/? } }
看完上面的代码可以理解到弹簧引导的存取文件思路了,存的时候的路径为
路径。get(根,文件名).toString ()))
这个路径会在本地的工程根目录上创建,不应用部署里的目录,所以一般的访问http访问不可能,所以它提供了ResourceLoader,利于这个类可以加载非应用目录的里文件然后返回,
所以就可以读取文件,所以就要写getFIle方法来显示图片,