问题介绍:
到我们把SpringBoot项目打包到Linux服务器上,文件的上传和上传的文件的下载路径及其获取就是一个比较棘手的问题。通俗一点就是解决像下面demo.jar中访问到110.png图片的文件,比如在页面显示啊
(图片很重要,图片很重要,图片很重要)
解决问题思路:
如果你用过kaptcha验证码插件,那你就应该猜到我的思路了,用流的方式请求URL返回到前端,而不能用
/abc/1123.jpg
这种方式
Demo介绍(路径见上图)
demo代码下载
在有图片上传的html上,将图片上传到上图中的位置,并且将图片的名称存到session中
访问success跳转到success.html中,其实success.html中有一个像请求验证码图片一样但是处理你上传图片的url
index.html
上传图片表单
<h1>图片上传</h1> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"/><input type="submit" value="submit"> </form>
上传图片的Contoller
将图片存到上面图片的位置中,没什么好解释的
@RequestMapping("/upload") @ResponseBody public String upload(MultipartFile file,HttpSession session) throws Exception { // 打印文件的名称 System.out.println("FileName:" + file.getOriginalFilename()); //将名字存到session中 session.setAttribute("photoName", file.getOriginalFilename()); // 确定上传文件的位置 // 本地路径,测试确实能通过 // String path = "E:/temp/temp"; // Linux系统 String path = "/usr/CBeann/temp"; // 获取上传的位置(存放图片的文件夹),如果不存在,创建文件夹 File fileParent = new File(path); if (!fileParent.exists()) { fileParent.mkdirs(); } File newFile = new File(path + "/", file.getOriginalFilename()); // 如果不存在,创建一个副本 if (!newFile.exists()) { newFile.createNewFile(); } // 将io上传到副本中 file.transferTo(newFile); return "上传成功"; }
跳转及其success.html
注意:success中img的src为一个controller中的url,而不是绝对或者相对路径,类似验证码插件url的意思
//跳转到success.html页面 @RequestMapping("/success") public String successHtml(){ return "success"; }
<body> --------- <img alt="demo" src="showimage"/> --------------- </body>
将图片以流的方式传到前端显示
获得Linux服务上的图片文件的file,然后以流的方式写入response中,我这用的是session或者上传图片的值
@RequestMapping("/showimage") public String showphoto(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception { response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); response.addHeader("Cache-Control", "post-check=0, pre-check=0"); response.setHeader("Pragma", "no-cache"); response.setContentType("image/jpeg"); // 获得的系统的根目录 File fileParent = new File(File.separator); String photoName = (String) session.getAttribute("photoName"); // 获得/usr/CBeann目录 File file = new File(fileParent, "usr/CBeann/temp/" + photoName); BufferedImage bi = ImageIO.read(new FileInputStream(file)); ServletOutputStream out = response.getOutputStream(); ImageIO.write(bi, "jpg", out); try { out.flush(); } finally { out.close(); } return null; }