SpringBoot项目上传图片

该博客展示了如何使用Spring MVC配置文件资源处理器,并实现图片上传功能。通过`@Configuration`和`WebMvcConfigurer`接口,配置了文件的存储路径。在`@PostMapping`的`/uploadFile`接口中,接收`MultipartFile`参数,进行文件类型检查,只允许上传jpg、png、gif、bmp格式的图片。文件上传成功后,会返回文件在服务器上的路径。

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

@Configuration
public class FileConfig implements WebMvcConfigurer {

	//配置文件中配置的文件存放路径
    @Value("${filePath}")
    private String filePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/file/**").addResourceLocations("file:"+filePath);
    }

    @Bean
    public Service service(){
        return new Service();
    }
}
	@Value("${filePath}")
    private String uploadUrl;
    
    @ApiOperation(value = "上传图片")
    @ApiImplicitParam(name = "file", value = "上传图片", required = true, dataType = "file", paramType = "form")
    @PostMapping("/uploadFile")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        long startTime = System.currentTimeMillis();
        ResponseEntity<String> response = null;
        log.info("~~~进入uploadFile方法~~~开始上传图片,文件名为:{}", file.getOriginalFilename());
        try {
            String uploadFileName = file.getOriginalFilename();
            if (!StringUtils.isEmpty(uploadFileName) && !uploadFileName.contains(".")) {
                response = new ResponseEntity<>("请上传带后缀的完整文件名", HttpStatus.BAD_REQUEST);
                return response;
            }
            //获取真实的上传文件类型
            String fileType = FileTypeUtil.getType(file.getInputStream());
            log.info("上传的文件真实类型为:{}", fileType);
            if ("jpg".equals(fileType) || "png".equals(fileType)
                    || "gif".equals(fileType) || "bmp".equals(fileType)) {
                //将文件暂存到指定的位置
                String destFileName = FileUtil.uploadToLocal(file, uploadUrl, String.valueOf(System.currentTimeMillis()));
                response = new ResponseEntity<>("/file/" + destFileName, HttpStatus.OK);
            } else {
                response = new ResponseEntity<>("支持的图片格式为jpg/png/gif/bmp", HttpStatus.BAD_REQUEST);
            }
            return response;
        } catch (IOException e) {
            log.error("uploadFile 上传图片 发生异常:{}", e.getMessage(), e);
            response = new ResponseEntity<>(AesEncryptUtils.encryptAES("服务异常"), HttpStatus.INTERNAL_SERVER_ERROR);
            return response;
        } finally {
            log.info("~~~uploadFile方法执行结束,耗时:{}秒,返回值为:{}~~~",
                    (float) (System.currentTimeMillis() - startTime) / 1000, response);
        }
    }
### 解决 Spring Boot 项目图片上传失败的问题 #### 1. 配置文件设置不当 确保 `application.properties` 或者 `application.yml` 文件中的配置项正确无误。对于大尺寸图片,可能需要调整服务器的最大请求大小以及文件上传限制。 ```properties # application.properties 示例 spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 如果使用的是 YAML 格式的配置,则应如下所示: ```yaml # application.yml 示例 spring: servlet: multipart: max-file-size: 10MB max-request-size: 10MB ``` 这些参数定义了单个文件和整个 HTTP 请求允许的最大字节数量[^1]。 #### 2. 控制器方法签名错误 检查控制器类里的处理函数是否按照标准方式编写。通常情况下,应该接收 MultipartFile 类型作为参数来表示待上传的文件对象。 ```java // Controller 方法示例 @PostMapping("/uploadImage") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { try { // Save the file... return new ResponseEntity<>("Successfully uploaded", HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.EXPECTATION_FAILED); } } ``` 此代码片段展示了如何通过 POST 请求接受客户端发送过来的一个或多张图像,并返回适当的状态码给前端应用。 #### 3. 缺少必要的依赖库 确认 pom.xml 中包含了所有必需的 Maven/Gradle 插件和支持多部分表单数据解析所需的 jar 包。特别是 spring-boot-starter-web 和 commons-io 等组件不可或缺。 ```xml <!-- pom.xml 示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency> ``` 上述 XML 片段列出了两个重要的依赖关系:一个是用于创建 RESTful Web Services 的 starter kit;另一个则是为了方便操作输入流而引入的实用工具集。 #### 4. 存储路径权限不足 当尝试保存接收到的数据到本地磁盘或其他持久化介质上时,请验证应用程序是否有足够的写入权限访问指定的目标目录。可以通过命令行测试目标位置是否存在读写障碍。 ```bash # 测试存储路径可写性的 Shell 命令 touch /path/to/save/images/test.txt && rm -f /path/to/save/images/test.txt ``` 这条简单的 Linux/MacOS 指令会临时创建并立即删除一个空文本文件,以此判断该处能否正常执行 I/O 操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值