application.properties

本文介绍如何在Spring应用中统一配置静态资源路径和数据库连接,通过application.properties文件管理,减少代码中路径调整的工作,同时利用mybatis框架简化JDBC操作。

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

对于一些路径的使用

在application.properties中我们可以进行配置,例如,配置静态资源文件夹

#原本我们向下面这样行写,直接写路劲,但是我们用到这个路径的地方有点多,在代码中也有用到.
#spring.web.resources.static-locations=file:d:/files,classpath:static


#所有我们向下面这样定义.使用
dirPath=d:/files
spring.web.resources.static-locations=file:${dirPath},classpath:static

controller中再进行一定的配置,到时候我们只用该application.properties中的配置文件我们就可以全局改变,不需要再到代码中进行全局改变,只需要改一个配置文件上的文件名字就好.

 在别的controller中使用这个路径的时候,我们也需要进行同样的改变,

 向这样配置完成以后,我们只需要在我们的application.properties的配置文件中改变路径的值就可以了,只需要改变里面的dirPath就行.后面换成我们想要的路径.

数据库的配置,这里的数据库是本机的配置,和我们静态资源文件夹的配置不一样,静态资源文件夹就算以后拿到代码,换一台机器运行,那个电脑上没有上面的d盘,我们可以只有该一个地方,然后整个代码可用,但是对于数据库的配置就是要结合实际的情况了,但是我们配置的是本机的,然后在使用mybatis框架的情况下,我们不需要进行JDBC的连接操作,mybatis框架会给我们完成好,它会自己在编译的时候内部运转好JDBC,而我们自己只需要写JDBC之外的代码,当然这个也要在配置文件中进行配置.

spring.datasource.url=jdbc:mysql://localhost:3306/数据库名字?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=用户名
spring.datasource.password=密码

eg:
spring.datasource.url=jdbc:mysql://localhost:3306/weibo?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root

当然我们也可以说一说JDBC:

JDBC  java database connectivity java 数据库连接

JDBC是java提供的一套API,是使用java连接数据库的一套标准API接口,各个数据库提供上都实现了这一条接口,提供了连接其提供的数据库产品的实现类(以jar包形式,又称为连接数据库的驱动包)

使用JDBC连接数据库的步骤:

1.加载驱动,  Class.forName( )

  Class.forName("com.mysql.cj.jdbc.Driver");//不同数据库的包名.类名不一样,但是对于同一个数据库无论那个版本写法都是一致的。


2,建立连接   DirverMannager建立连接

  //1
        Class.forName("com.mysql.cj.jdbc.Driver");//不同数据库的包名.类名不一样,但是对于同一个数据库无论那个版本写法都是一致的。
        //2
        /*
            DriverManager的getConnection用来连接数据库,该方法需要传入三个String类型的参数
            参数1:数据库的URL地址(每种数据库有各自的固定格式)
            参数2:用户名
            参数3:密码
            该方法返回一个java.sql.Connection的实例(Connection是一个接口,是JDBC核心接口之一,表示与
            数据库的一个连接,不同的数据库驱动包中都提供了对应的实现类)

         */
        //                               jdbc:不同数据库的URL格式...  /数据库名?参数
        try (
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true", "root", "root");
        ) {


3.获取执行对象

  /*
                通过连接对象Connection获取执行SQL的执行对象Statement
                Statement对象用于向数据库执行SQL语句
             */
                Statement statement = conn.createStatement();

完整的一个JDBC的案例如下

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC java database connectivity java数据库连接
 * JDBC是有SUM提供的一套API,是使用java连接数据的一套标准API接口,各个数据库提供上都实现了这一条接口提供了
 * 连接其提供的数据库产品的实现类(以jar包形式,又称为连接该数据库的驱动包)。
 */
public class JDBCDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            使用JDBC连接数据库的步骤
            1:加载驱动 Class.forName()
            2:建立连接 DirverManager建立连接
            3:获取执行对象
         */
        //1
        Class.forName("com.mysql.cj.jdbc.Driver");//不同数据库的包名.类名不一样,但是对于同一个数据库无论那个版本写法都是一致的。
        //2
        /*
            DriverManager的getConnection用来连接数据库,该方法需要传入三个String类型的参数
            参数1:数据库的URL地址(每种数据库有各自的固定格式)
            参数2:用户名
            参数3:密码
            该方法返回一个java.sql.Connection的实例(Connection是一个接口,是JDBC核心接口之一,表示与
            数据库的一个连接,不同的数据库驱动包中都提供了对应的实现类)

         */
        //                               jdbc:不同数据库的URL格式...  /数据库名?参数
        try (
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true", "root", "root");
        ) {
            /*
                通过连接对象Connection获取执行SQL的执行对象Statement
                Statement对象用于向数据库执行SQL语句
             */
                Statement statement = conn.createStatement();
            /*
                新建一张表:userinfo
                表字段:id,username,password,age,salary
             */
                String sql = "CREATE TABLE userinfo(" +
                        "       id INT primary key auto_increment," +
                        "       username VARCHAR(30) NOT NULL ," +
                        "       password VARCHAR(30)," +
                        "       age INT(3)," +
                        "       salary DOUBLE(7,2)" +
                        "     )";
            /*
                execute(String sql)
                该方法可以用来执行任意类型的SQL语句,但是由于DML,DQL有专门的SQL
                因此该方法常用于执行DDL语句(CREATE,DROP,ALTER)
             */
                statement.execute(sql);
                System.out.println("执行完毕!");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }


    }
}

所以我们可以省去写JDBC的步骤,直接配置数据库.

<think>我们正在讨论如何在后端实现动态保存图片路径。根据之前的引用,我们可以总结出几个关键点: 1. 后端接收到前端上传的图片文件(通常通过MultipartFile或类似对象)。 2. 后端需要将图片保存到服务器的某个目录(可以是本地目录,也可以是云存储等)。 3. 后端需要生成一个可以访问该图片的URL(可能是相对路径或绝对URL)。 4. 将这个URL保存到数据库,以便前端后续访问。 接下来,我将分步骤详细说明如何实现。 ### 步骤1: 确定存储位置 首先,我们需要确定图片存储的根路径。这个路径可以是: - 项目内部的静态资源目录(例如:`/static/upload/`) - 项目外部的某个目录(例如:`D:/upload/`) - 云存储(如阿里云OSS、腾讯云COS等) 这里以本地存储为例,我们可以将存储路径配置配置文件中,以便灵活修改。 ### 步骤2: 处理上传请求 在后端控制器中,编写一个处理文件上传的接口。以下是一个Spring Boot的示例(使用Java): ```java @PostMapping("/upload") public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file) { try { // 1. 定义存储目录(可以是配置项) String uploadDir = "/var/www/uploads/"; // 或者从配置读取 // 2. 确保目录存在 File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 3. 生成唯一文件名,避免冲突 String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String uniqueFileName = UUID.randomUUID().toString() + fileExtension; // 4. 保存文件 File dest = new File(uploadDir + uniqueFileName); file.transferTo(dest); // 5. 生成访问URL(这里假设通过静态资源映射访问,所以返回相对路径) String accessUrl = "/uploads/" + uniqueFileName; // 6. 将accessUrl保存到数据库(这里省略数据库操作) return ResponseEntity.ok(accessUrl); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("上传失败"); } } ``` ### 步骤3: 配置静态资源映射 为了让前端能够通过生成的URL访问图片,我们需要配置静态资源映射。在Spring Boot中,可以在配置类中添加: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/uploads/**") .addResourceLocations("file:/var/www/uploads/"); } } ``` 这样,前端通过`http://yourdomain/uploads/文件名`就可以访问图片了。 ### 步骤4: 保存路径到数据库 在保存文件后,将生成的访问URL(如上例中的`accessUrl`)存入数据库的相应表字段中。 ### 动态路径的考虑 - **动态生成文件名**:使用UUID等唯一标识避免重名。 - **动态存储目录**:可以根据日期等动态创建子目录,例如按年/月/日存储,避免单个目录文件过多。 - **配置文件存储根路径**:将存储根路径放在配置文件中(如`application.properties`),这样在不同环境(开发、测试、生产)可以切换。 ### 示例:按日期生成目录 修改保存文件的步骤: ```java // 获取当前日期 LocalDate today = LocalDate.now(); String datePath = today.getYear() + "/" + today.getMonthValue() + "/" + today.getDayOfMonth() + "/"; // 创建日期目录 File dateDir = new File(uploadDir + datePath); if (!dateDir.exists()) { dateDir.mkdirs(); } // 保存文件到日期目录 File dest = new File(uploadDir + datePath + uniqueFileName); file.transferTo(dest); // 访问URL包含日期部分 String accessUrl = "/uploads/" + datePath + uniqueFileName; ``` ### 注意事项 1. **安全性**:检查上传文件类型,防止上传恶意文件。 2. **文件大小限制**:在配置中设置最大文件上传大小。 3. **跨平台路径**:使用`File.separator`或`Paths.get()`来构建路径,确保在不同操作系统上都能正常工作。 ### 总结 动态保存图片路径的关键在于: - 动态生成存储路径(包括目录和文件名) - 将生成的访问路径(URL)保存到数据库 - 配置静态资源映射,使存储的图片能够被访问 这样,当用户上传图片时,后端会生成一个唯一的存储路径,并将可访问的URL返回给前端,同时保存到数据库。前端在需要显示图片时,只需使用这个URL即可。 §§相关问题§§ 1. 如何防止上传的文件重名? 2. 如何限制用户上传的文件类型? 3. 如何将图片保存到云存储(如阿里云OSS)? 4. 如何实现图片上传后的缩略图生成? 5. 如何在前端显示动态路径的图片?</think>### 后端动态保存图片路径的实现方法 要实现后端动态保存图片路径,核心是**接收图片文件 → 生成唯一存储路径 → 保存文件 → 记录可访问的URL到数据库**。以下是具体步骤和代码示例: --- #### 1. **确定存储位置**(动态路径关键) 使用配置文件定义基础路径,支持不同环境切换: ```properties # application.properties (示例) file.upload-dir=/var/www/uploads/ # Linux绝对路径 # file.upload-dir=D:\\project\\uploads\\ # Windows路径 ``` --- #### 2. **处理图片上传**(Spring Boot示例) ```java @PostMapping("/upload") public ResponseEntity<String> uploadImage( @RequestParam("file") MultipartFile file, HttpServletRequest request) { // 获取配置的存储根目录 String baseDir = env.getProperty("file.upload-dir"); // 动态生成子目录(按日期分类) String datePath = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); // 20230815 String fullPath = Paths.get(baseDir, datePath).toString(); // 创建目录(不存在时自动创建) File dir = new File(fullPath); if (!dir.exists()) dir.mkdirs(); // 生成唯一文件名(防重名) String uuid = UUID.randomUUID().toString(); String ext = FilenameUtils.getExtension(file.getOriginalFilename()); String fileName = uuid + "." + ext; // e.g: "c3d45f7a-12b3-4eae.jpg" // 保存文件到动态路径 Path filePath = Paths.get(fullPath, fileName); Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING); // 生成可访问的URL(非磁盘路径!) String accessUrl = request.getScheme() + "://" + request.getServerName() + "/uploads/" + datePath + "/" + fileName; // 示例: https://yourdomain/uploads/20230815/c3d45f7a.jpg // 将accessUrl存入数据库(非磁盘路径!) imageService.saveImagePath(accessUrl); return ResponseEntity.ok(accessUrl); } ``` --- #### 3. **配置静态资源映射**(关键步骤) ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Value("${file.upload-dir}") private String uploadDir; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 将物理路径映射为虚拟URL registry.addResourceHandler("/uploads/**") .addResourceLocations("file:" + uploadDir + "/"); } } ``` --- #### 4. **数据库存储设计** 建议数据库表字段存储生成的**URL**而非物理路径: ```sql CREATE TABLE images ( id INT AUTO_INCREMENT, url VARCHAR(255) NOT NULL, -- 存储如 "/uploads/20230815/c3d45f7a.jpg" PRIMARY KEY (id) ); ``` --- ### 关键注意事项 1. **永远不返回磁盘路径给前端** (如 `D:\project\uploads\` 会导致前端无法访问) 2. **路径动态化技巧**: - 按日期分层:`/2023/08/15/filename.jpg` 避免单目录文件过多 - 使用UUID文件名:防止重名覆盖 3. **跨平台路径处理**: ```java // 使用Paths代替字符串拼接 Path path = Paths.get("baseDir", "subdir", "filename.jpg"); ``` 4. **安全性**: ```java // 检查文件扩展名 if (!Arrays.asList("jpg", "png").contains(ext)) { throw new InvalidFileTypeException(); } ``` --- ### 前端配合建议 前端通过 `<img src="后端返回的URL">` 直接显示: ```html <!-- 示例:使用动态URL --> <img src="https://yourdomain/uploads/20230815/c3d45f7a.jpg" alt="动态图片"> ``` > 此方案实现了: > 1. 路径动态生成(日期目录+UUID文件名) > 2. 物理路径与可访问URL解耦 > 3. 数据库存储前端可直接使用的URL > 4. 支持水平扩展(后续可无缝迁移到云存储)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值