springboot 上传图片

spring boot 完整后端接口案例_cc&的博客-CSDN博客

Controller 层

package com.cc.springServer.controller;

import com.cc.springServer.base.JsonResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import java.util.UUID;

@RestController
public class imgController {
    /**
     * 时间格式化
     */
    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");

    /**
     * 图片保存路径,自动从yml文件中获取数据
     *   示例: E:/images/
     */

    @Value("${file-save-path}")
    private String fileSavePath;


    @PostMapping("/upload")
    public JsonResult uploadFile(MultipartFile file, HttpServletRequest request) {
        //后半段目录:  2020/03/15
        String directory = simpleDateFormat.format(new Date());
        /**
         * 文件保存目录  E:/images/2020/03/15/
         * 如果目录不存在,则创建
         */

        File dir = new File(fileSavePath + directory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        System.out.println("图片上传,保存位置:" + fileSavePath + directory);
        //给文件重新设置一个名字
        //后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String newFileName= UUID.randomUUID().toString().replaceAll("-", "")+suffix;

        //创建这个新文件
        File newFile = new File(fileSavePath + directory + newFileName);
        //复制操作
        try {
            file.transferTo(newFile);
            //协议 :// ip地址 :端口号 / 文件目录(/images/2020/03/15/xxx.jpg)
            String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/images/" + directory + newFileName;
            System.out.println("图片上传,访问URL:" + url);
            return JsonResult.builder().data(url).message("上传成功!").code("200").build();
        } catch (IOException e) {

            return JsonResult.builder().data(null).message("IO异常!").code("500").build();
        }
    }
}

工具类

返回JSON数据

package com.cc.springServer.base;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class JsonResult implements Serializable {
    private String code;
    private String message;
    private Object data;
}

配置映射路径(重点)

package com.cc.springServer.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    /**
     * 图片保存路径,自动从yml文件中获取数据
     *   示例: E:/images/
     */
    @Value("${file-save-path}")
    private String fileSavePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 配置资源映射
         * 意思是:如果访问的资源路径是以“/images/”开头的,
         * 就给我映射到本机的“E:/images/”这个文件夹内,去找你要的资源
         * 注意:E:/images/ 后面的 “/”一定要带上
         */
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:"+fileSavePath);
    }

}

application.yml

file-save-path: E:/images/

测试

遇到问题:

问题:静态资源访问

解决:

package com.cc.springServer.config;

import com.cc.springServer.filter.AuthenticationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Autowired
    private AuthenticationFilter authenticationFilter;

    protected void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(authenticationFilter).
//                拦截所有请求
        addPathPatterns("/**").
//                登录请求排除,不被拦截
        excludePathPatterns("/auth/login","/static/**");
                //3、允许访问localhost:8080/static/**,使得这个路径不会被拦截器拦截

    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }



}

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中实现图片上传可以参考以下步骤: 1. 创建一个控制器类,比如UploadImgController.java,使用@Controller注解标记该类。在该类中,使用@RequestMapping注解指定URL路径,比如"/fileUpload",并定义一个方法来处理图片上传请求。方法的参数中使用MultipartFile类型的参数来接收上传的图片文件。在方法体中,调用相应的服务类来处理图片上传逻辑,并返回一个ImageVo对象,该对象包含了上传结果的相关信息。\[2\] 2. 创建一个服务类,比如UploadImgService.java,用于处理图片上传逻辑。在该类中,可以使用@Resource注解来注入相应的依赖。在方法中,可以使用MultipartFile对象的方法来获取图片的相关信息,比如文件名、文件大小等。然后,可以使用相应的库或工具来保存图片文件,并返回一个包含上传结果的ImageVo对象。\[2\] 3. 创建一个图片的VO类,比如ImageVo.java,用于封装上传结果的相关信息。该类可以使用Lombok库来简化代码,使用@Data注解来自动生成getter和setter方法,使用@AllArgsConstructor注解来生成全参构造方法,使用@NoArgsConstructor注解来生成无参构造方法,使用@Accessors(chain = true)注解来支持链式调用。在该类中,可以定义一些静态方法来创建成功或失败的ImageVo对象,方便在服务类中使用。\[3\] 以上是一个简单的Spring Boot图片上传的实现示例,具体的实现方式可能会根据项目的需求和具体情况有所不同。 #### 引用[.reference_title] - *1* *2* *3* [SpringBoot实现图片的上传](https://blog.csdn.net/xiaochen_2715/article/details/125450681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值