springboot 上传图片存储在后台,并指定存储路径

本文详细介绍了如何在SpringBoot 2.x中配置文件上传,包括设置单个文件和总请求的最大大小,定义文件上传后的存储路径及访问URL,以及如何在代码中实现文件的接收和保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、springboot 2.x

2、application.properties

#单个数据的大小
spring.servlet.multipart.maxFileSize=10Mb
#总数据的大小
spring.servlet.multipart.maxRequestSize=10Mb

#文件上传后存储路径:D:\home\capture\5\*.jpg(具体配置如下)
#访问Url:http://ip:port/hg-zhwg/upload/5/*.jpg

#文件上传目录(window是d/e/f盘, linux是/)(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/
file.uploadFolder=d://
# 设备截图文件保存路径(文件存在具体的文件夹的路径)
zhwg.captrue.image.path=home/capture/
#静态资源对外暴露的访问路径(访问图片的路径)
file.staticAccessPath=/upload/**

启动类,需要增加multipartConfigElement方法

public class HgZhwgApplication {
	@Value("${file.uploadFolder}")
	private String uploadFolder;

    public static void main(String[] args) {
        SpringApplication.run(HgZhwgApplication.class, args);
    }
    
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation(uploadFolder);
        return factory.createMultipartConfig();
    }
}

拦截器中的配置,增加addResourceHandlers方法,指定访问路径。addInterceptors方法需要过滤掉staticAccessPath

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Value("${file.staticAccessPath}")
	private String staticAccessPath;
	
	@Value("${zhwg.captrue.image.path}")
	private String captureImagePath;
	
	@Value("${file.uploadFolder}")
	private String uploadFolder;

	@Bean
	public SecutityInterceptor securityInterceptor() {
		return new SecutityInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(securityInterceptor()).addPathPatterns("/**").excludePathPatterns("/login/**")
				.excludePathPatterns("/deviceCmd/**").excludePathPatterns("/image/**")
				.excludePathPatterns(staticAccessPath);

	}

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("*").maxAge(3600);
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder + captureImagePath);
	}

}

最后就是上传文件的方法

@RequestMapping("/recive/{devType}/{cmdLogId}")
	public void reciveCameraCapture(@PathVariable("devType") String devType, @PathVariable("cmdLogId") String cmdLogId,
			@RequestParam("captureImg") MultipartFile captureImg,
			@RequestParam(value = "cameraPreviewId", required = false) Long cameraPreviewId,
			@RequestParam("token") String token, HttpServletRequest request, HttpServletResponse response) {
		if (captureImg == null) {
			return;
		}

		// 保存图片
		String filename = captureImg.getOriginalFilename();
		// 文件后缀名
		String prefix = filename.substring(filename.lastIndexOf(".") + 1);
		String destFilename = UUID.randomUUID().toString().replace("-", "") + "." + prefix;
		
		File fileUrl = new File(uploadFolder + captureImagePath + devType);

		if (!fileUrl.exists()) {
			fileUrl.mkdirs();
		}

		File destImage = new File(fileUrl, destFilename);

		logger.debug("图片保存地址为:" + destImage);
		try {
			captureImg.transferTo(destImage);
		} catch (IOException e) {
			logger.error("图片保存失败", e);
		}
	}

访问:成功
在这里插入图片描述

### 如何在 Spring Boot 后端项目中实现 Canvas 数据的存储 为了实现在 Spring Boot 中存储来自前端 Canvas 绘制的数据,通常会采用以下几种方式: #### 1. 将 Canvas 图像转换为 Base64 编码保存至数据库 当用户完成绘制后,可以将 Canvas 上的内容导出成图片格式(如 PNG 或 JPEG),通过 JavaScript 转换成 Base64 字符串发送给服务器。服务器接收到该字符串之后再将其解码回二进制文件形式,最终存入关系型或非关系型数据库。 ```java @PostMapping("/saveImage") public ResponseEntity<String> saveImage(@RequestParam("image") String base64Image) { try { byte[] imageBytes = Base64.getDecoder().decode(base64Image.split(",")[1]); Path path = Paths.get("uploads/image.png"); Files.write(path, imageBytes); // Save to database logic here return new ResponseEntity<>("Image saved successfully", HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 此方法适用于较小尺寸的图像,因为较大的图像可能会导致性能下降以及增加网络传输负担[^1]。 #### 2. 使用 JSON 序列化路径数据结构 如果只需要记录用户的绘画动作而不需要完整的渲染结果,则可以选择只传递必要的坐标信息和其他属性作为一组有序的对象列表来表示整个图形。这些对象可以通过 JSON 格式序列化传送到后台,在那里它们可以直接被解析出来用于后续处理或者持久化到 NoSQL 类型的数据存储解决方案里去。 ```json [ {"type": "line", "fromX": 50, "fromY": 70, "toX": 80, "toY": 90}, {"type": "circle", "centerX": 100, "centerY": 120, "radius": 30} ] ``` 这种方式不仅减少了不必要的冗余数据量而且提高了系统的灵活性和可扩展性[^2]。 #### 3. 存储 SVG 文件 对于矢量图来说,SVG 是一种非常适合的选择。它允许以 XML 文本的形式描述形状、颜色以及其他视觉效果。因此可以在客户端上构建好对应的 DOM 结构后再提交给服务端进行保存。由于其基于文本的本质特性使得版本控制变得容易很多同时也便于编辑工具集成。 ```xml <svg width="100" height="100"> <rect x="10" y="10" rx="15" ry="15" width="80" height="80" style="fill:red;stroke:black;stroke-width:5;opacity:0.5"/> </svg> ``` 这种方法特别适合那些希望保持高质量缩放特性的应用场景[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值