欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring boot 图片上传与显示功能实例详解

程序员文章站 2024-02-29 20:15:52
首先描述一下问题,spring boot 使用的是内嵌的tomcat, 所以不清楚文件上传到哪里去了, 而且spring boot 把静态的文件全部在启动的时候都会加载到c...

首先描述一下问题,spring boot 使用的是内嵌的tomcat, 所以不清楚文件上传到哪里去了, 而且spring boot 把静态的文件全部在启动的时候都会加载到classpath的目录下的,所以上传的文件不知相对于应用目录在哪,也不知怎么写访问路径合适,对于新手的自己真的一头雾水。

后面想起了官方的例子,没想到一开始被自己找到的官方例子,后面太依赖百度谷歌了,结果发现只有官方的例子能帮上忙,而且帮上大忙,直接上密码的代码

package hello; 
import static org.springframework.hateoas.mvc.controllerlinkbuilder.linkto; 
import static org.springframework.hateoas.mvc.controllerlinkbuilder.methodon; 
import java.io.ioexception; 
import java.nio.file.files; 
import java.nio.file.paths; 
import java.util.stream.collectors; 
import javax.servlet.http.httpservletrequest; 
import org.slf4j.logger; 
import org.slf4j.loggerfactory; 
import org.springframework.beans.factory.annotation.autowired; 
import org.springframework.core.io.resourceloader; 
import org.springframework.http.responseentity; 
import org.springframework.stereotype.controller; 
import org.springframework.ui.model; 
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.requestmapping; 
import org.springframework.web.bind.annotation.requestmethod; 
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.responsebody; 
import org.springframework.web.multipart.multipartfile; 
import org.springframework.web.servlet.mvc.support.redirectattributes; 
@controller 
public class fileuploadcontroller { 
 private static final logger log = loggerfactory.getlogger(fileuploadcontroller.class); 
 public static final string root = "upload-dir"; 
 private final resourceloader resourceloader; 
 @autowired 
 public fileuploadcontroller(resourceloader resourceloader) { 
 this.resourceloader = resourceloader; 
 } 
 @requestmapping(method = requestmethod.get, value = "/") 
 public string provideuploadinfo(model model) throws ioexception { 
 model.addattribute("files", files.walk(paths.get(root)) 
  .filter(path -> !path.equals(paths.get(root))) 
  .map(path -> paths.get(root).relativize(path)) 
  .map(path -> linkto(methodon(fileuploadcontroller.class).getfile(path.tostring())).withrel(path.tostring())) 
  .collect(collectors.tolist())); 
 return "uploadform"; 
 } 
//显示图片的方法关键 匹配路径像 localhost:8080/b7c76eb3-5a67-4d41-ae5c-1642af3f8746.png 
 @requestmapping(method = requestmethod.get, value = "/{filename:.+}") 
 @responsebody 
 public responseentity<?> getfile(@pathvariable string filename) { 
 
 try { 
  return responseentity.ok(resourceloader.getresource("file:" + paths.get(root, filename).tostring())); 
 } catch (exception e) { 
  return responseentity.notfound().build(); 
 } 
 } 
<strong>//上传的方法</strong> 
 @requestmapping(method = requestmethod.post, value = "/") 
 public string handlefileupload(@requestparam("file") multipartfile file, 
redirectattributes redirectattributes, httpservletrequest request) { 
 system.out.println(request.getparameter("member")); 
 if (!file.isempty()) { 
  try { 
  files.copy(file.getinputstream(), paths.get(root, file.getoriginalfilename())); 
  redirectattributes.addflashattribute("message", 
   "you successfully uploaded " + file.getoriginalfilename() + "!"); 
  } catch (ioexception|runtimeexception e) { 
  redirectattributes.addflashattribute("message", "failued to upload " + file.getoriginalfilename() + " => " + e.getmessage()); 
  } 
 } else { 
  redirectattributes.addflashattribute("message", "failed to upload " + file.getoriginalfilename() + " because it was empty"); 
 } 
 return "redirect:/"; 
 } 
} 

看完上面的代码可以理解到spring boot 的存取文件思路了,存的时候的路径为

paths.get(root, filename).tostring())) 

这个路径会在本地的工程根目录上创建,不应用部署里的目录,所以一般的访问http访问不可能 ,所以它提供了resourceloader,利于这个类可以加载非应用目录的里文件然后返回 

所以就可以读取文件,所以就要写getfile方法来显示图片 

spring boot 图片上传与显示功能实例详解

如果大家对spring boot不是很了解,大家可以参考下面两篇文章。

spring boot 快速入门教程

spring boot 快速入门指南

以上所述是小编给大家介绍的spring boot 图片上传与显示功能实例详解,希望对大家有所帮助