Springboot文件上传与文件映射(保存URL至数据库)完整代码

Springboot文件上传与文件映射(保存URL至数据库)完整代码

0.前言

场景:上传图片文件至服务器,并且在数据库中保存一个有效URL,用于获取该图片。

先看最终效果如下:
长传图片文件效果演示
我之前也看过很多相关的文章,大部分都只是之讲解了一部分,导致我看了很多…做了很多无用功,因此实现此功能后想记录并总结一下完整的过程,已被之后复习。
其实这个功能很简单,把它分为两步部分:

  • 上传文件
  • 文件映射

而且这两部分是独立的,互不影响。
上传文件有多种方法:

  • 使用Servlet的API,write()方法写入文件(本文采用的这种)
  • 使用MultipartFile对象获取上传的文件并使用该对象的transferTo()方法
  • 使用commons-fileupload工具包实现文件上传
    等等…
    这里不会具体把每一种都写,只写了第一种,也是本人认为最简洁的。

文件映射比较简单,只需添加一个配置类即可,即本文的第二点。

1.配置上传文件保存路径

1.1 Windows环境

首先,先搞定window环境下的本地测试。我是在D盘下新建了一个用于保存上传文件的restaurantRes文件夹。
application.properties中添加配置如下:

#文件上传路径
#windows环境下上传文件保存目录
spring.servlet.multipart.location=d:/restaurantRes
1.2 Linux环境

之后要在Linux环境下的服务器测试,我在根目录下创建了pic文件夹,pic下创建了upload文件夹。配置写法如下:
(区别:Linux文件系统没有分盘)

#文件上传路径
#linux环境下上传文件保存目录
spring.servlet.multipart.location=/pic/upload

2.添加文件路径映射

新建一个配置类Java文件:WebMvcConfig.Java(名字取啥不重要)
编码如下:

2.1 Windows环境下文件路径映射

上传文件路径:D盘下的restaurantRes目录中(D:/restaurantRes/)
访问路径举例:http://localhost:8080/restaurantRes/青豆玉米粒披萨.jpg

代码中:
addResourceHandler为添加访问前缀,及上述的访问路径中的restaurantRes
addResourceLocations为添加文件原本的存储路径,及上述的上传文件路径中的D:/restaurantRes/

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //windows本地文件目录
        registry.addResourceHandler("/restaurantRes/**").addResourceLocations("file:D:/restaurantRes/");
    }
}
2.2 Linux环境下文件路径映射

与上述基本一致,只是路径写法不一样。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //linux服务器文件目录
        //registry.addResourceHandler("/restaurantRes/**").addResourceLocations("file:/pic/upload/");
    }
}

3.控制层/实体类代码

代码中包含每个操作的详细注释。
其中注释掉了URL中的端口,是因为本项目已经配置过Https了,默认会使用443,无需再写端口。如果是windows环境本地测试或没有配置hhtps那就加上那个端口就好啦。

@Controller
@RequestMapping(value = "/restaurantApi/admin")
public class AdminController {

    static String fileLocation = "/restaurantRes/";//图片资源访问路径
    //存储预返回页面的结果对象
    private Map<String, Object> result = new HashMap<>();
    //注入业务对象
    @Resource
    private AdminService adminService;
  @PostMapping("/addFood")
    @ResponseBody
    public Map<String, Object> uploadFood(String name, double prices, String description, Part pictureFile,
                                          HttpServletRequest request) {
        //获取提交文件名称
        String filename = pictureFile.getSubmittedFileName();
        //定义上传文件存放的路径
        String path = request.getSession().getServletContext().getRealPath(fileLocation);//此处为tomcat下的路径,服务重启路径会变化
        System.out.println(path);
        //返回保存的url,根据url可以进行文件查看或者下载
        String filePath = request.getScheme() + "://" + request.getServerName()
                //+ ":" + request.getServerPort() //端口 https443端口无需添加
                + fileLocation + filename;

        String pictureFileURL = filePath;//根路径+文件名

//插入这条Food数据
        adminService.addFood(new Food(name, prices, description, pictureFileURL));

        //写入文件
        try {
            pictureFile.write(filename);
            result.put("Result", "添加菜品信息成功");
        } catch (IOException e) {
            e.printStackTrace();
            result.put("Result", "添加菜品信息失败");
        }
        return result;
    }
}

其中Food实体类的具体定义如下,与数据库中food表字段一一对应:

/**
 * 菜品实体类
 * 1.菜名
 * 2.价格
 * 3.菜品详细描述
 * 4.菜对应的图片文件URL
 */
 //Lombok插件使用注释
@Data                              // get,set
//@NoArgsConstructor                 //无参构造
@AllArgsConstructor                //有参构造
public class Food {
    private String name;
    private double prices;
    private String description;
    private String pictureFileURL;
}

相信到这里,上传文件与文件映射功能已经基本了解过程了,与上传文件与文件映射功能本身的代码已经全部展示了,下面是完成插入这条food数据操作的其他代码.

4.其他代码

4.1服务层代码

只有插入菜品信息的代码。
AdminService.java

public interface AdminService {
    // 添加信息
    int addFood(Food food);
}

AdminServiceImpl.java

@Service
@Transactional
public class AdminServiceImpl implements AdminService {

    //注入Mapper接口对象
    @Resource
    private AdminMapper adminMapper;

    @Override
    public int addFood(Food food) {
        return adminMapper.insertFood(food);
    }
}
4.2 数据访问层

插入这条数据
AdminMapper.java

/**
 * 数据访问层-操控信息
 */
@Mapper
public interface AdminMapper {
    // 添加菜品信息
    int insertFood(Food food);
}

AdminMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.lipiao.traveltreasure.dao.restaurant.AdminMapper">
    <!-- 添加活动信息 -->
    <insert id="insertFood" parameterType="com.lipiao.traveltreasure.bean.restaurantBean.Food">
        INSERT INTO food(name, prices, description, pictureFileURL)
        VALUES (#{name}, #{prices}, #{description}, #{pictureFileURL})
    </insert>
</mapper>
4.3启动类
@SpringBootApplication
@MapperScan("com.lipiao.traveltreasure.dao") //扫描Mapper接口
public class TravelTreasureApplication {
    public static void main(String[] args) {
        SpringApplication.run(TravelTreasureApplication.class, args);
    }
}

5.总结

之前在这个功能花费了一些时间,是因为路径问题出错了,少写或多写了/。
还是得细心细心再细心!
文件路径映射+文件上传至此已完成了,希望这篇自我小结得笔记能够对你帮助!若有问题欢迎留言。

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
好的,针对您的问题,可以使用Java编程和Spring Boot框架实现文件信息存储在数据库中。 首先,您需要定义一个文件信息的实体类,包含文件名、文件路径、文件类型、文件大小等基本属性,并使用注解标记实体类与数据库表的映射关系。 然后,您需要创建一个Repository接口,继承自Spring Data JPA提供的CrudRepository接口,用于定义文件信息的增删改查操作。 接着,您可以编写一个Service类,调用Repository接口提供的方法实现对文件信息的操作。 最后,在Spring Boot应用程序的配置文件中,配置数据库连接信息和相关属性,启动应用程序时,Spring Boot会自动创建数据库表和初始化数据。 下面是一个示例代码: 文件信息实体类: ``` @Entity @Table(name = "file_info") public class FileInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "file_name") private String fileName; @Column(name = "file_path") private String filePath; @Column(name = "file_type") private String fileType; @Column(name = "file_size") private Long fileSize; // getters and setters } ``` Repository接口: ``` public interface FileInfoRepository extends CrudRepository<FileInfo, Long> { // 定义自定义查询方法 } ``` Service类: ``` @Service public class FileInfoService { @Autowired private FileInfoRepository fileInfoRepository; public FileInfo saveFileInfo(FileInfo fileInfo) { return fileInfoRepository.save(fileInfo); } public void deleteFileInfo(Long id) { fileInfoRepository.deleteById(id); } public FileInfo getFileInfo(Long id) { return fileInfoRepository.findById(id).orElse(null); } // 其他查询方法 } ``` 配置文件: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ``` 以上代码仅供参考,具体实现方式可能因应用场景不同而异。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值