springboot中保存上传的图片,并显示

图片上传在实际开发中可能会经常遇到,本文介绍了springboot中图片的上传与显示。文中如有不正之处,欢迎各位批评指正。

一、图片上传

1、自定义图片保存路径

通常会将上传的图片上传保存到本地磁盘,所以我们在配置文件application.properties中自定义保存位置。

web.upload-path=D:/test/

这里要注意,指定的路径要以 / 结尾

2、编写Service层

public class ImageService {
	
	@Value("${web.upload-path}")
	private String path;            //自定义路径
	
	/**
	 * 保存图片
	 * @param image   上传的图片
	 * @return
	 */
	public Object saveImage(MultipartFile image) {
		
		if(null == image) {
			return "上传图片不能为空";
		}
		
		//获取图片类型
		String exName = image.getOriginalFilename().substring(image.getOriginalFilename().lastIndexOf("."));
		//使用工具类UUID给图片重命名
		String fileName = UUID.randomUUID().toString().replaceAll("-", "") + exName;
		//为了便于我们查找图片,将保存路径以 年 / 月 / 日 / 的格式命名
		StringBuilder realPath = new StringBuilder(path);
		realPath.append(DateUtils.getYear() + File.separator + DateUtils.getMonth() + File.separator + DateUtils.getDay() + File.separator);
		realPath.append(fileName);
		
		File file = new File(realPath.toString());
		if(!file.getParentFile().exists()) {
		    file.getParentFile().mkdirs();
		}
		
		try {
			image.transferTo(file);
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
			return "请重新上传图片";
		}	

                //将图片的保存路径realPath保存到数据库中
		/* .............. */
		
		return "图片保存成功";
	}
	
}

3、编写Controller

@RestController
@RequestMapping("/image")
public class ImageController {
	
	@Autowired
	ImageService imageService;
	
	@PostMapping("post")
	public Object post(MultipartFile image) {
		return imageService.saveImage(image);
	}

}

二、图片显示

这里介绍图片显示的两种方式,先来介绍第一种方式,通过配置静态资源路径进行访问。

1、配置静态资源访问

(1)静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户通过浏览器直接读取。

(2)springboot中默认的静态资源路径有:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

(3)springboot中可以直接在配置文件中覆盖默认的静态资源路径的配置信息:

web.upload-path=D:/test/

#表示所有的访问都经过静态资源路径
spring.mvc.static-path-pattern=/**

#末尾的file:${web.upload-path}中的file:表示是一个具体的硬盘路径
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,
file:${web.upload-path}

2、访问资源

在浏览器中输入:localhost:8080/2018/11/26  ,如我的保存路径为D:/test/2018/11/26/xxx.png,因为配置静态资源访问路径,所以只需要上面的地址加上想要查看的图片名称,即可查看图片。

这里我们介绍第二种,通过IO流向浏览器中读出图片。通过这种方式获取图片,可以省略以下的配置

#表示所有的访问都经过静态资源路径
spring.mvc.static-path-pattern=/**

#末尾的file:${web.upload-path}中的file:表示是一个具体的硬盘路径
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,
file:${web.upload-path}

1、编写Controller层

@RestController
@RequestMapping("/image")
public class ImageController {
	
	@GetMapping("get")
	public void get(String id, HttpServletResponse response) {
		
		/* 从数据库中获取图片保存的完整路径realPath */
		Image image = imageService.selectById(id);
		
		String path = image.getPath();
		//设置ContentType的类型
		String type = "image/" + image.getExName() + ";charset=utf-8";
		FileInputStream inputStream = null;
		OutputStream stream = null;
		
		try {
			File file = new File(path);   
			inputStream = new FileInputStream(file);
		     byte[] data = new byte[(int) file.length()];
		     inputStream.read(data);
		     //setContentType("text/plain; charset=utf-8"); 文本
		     response.setContentType(type);
		     stream = response.getOutputStream();
		     stream.write(data);
		     stream.flush();  
		 } catch(Exception e) {
			 e.printStackTrace();
		 } finally {
			 try {
				inputStream.close();
				stream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		 }
		 	 
	 }

}

****省略service层

2、访问

在浏览器中输入:localhost:8080/image/get?id=xxxx,即可查看想要查看的图片。

 

 

你可能感兴趣的:(springboot学习)