最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中實(shí)現(xiàn)文件上傳、下載、刪除功能的步驟

 更新時(shí)間:2024年01月16日 09:28:20   作者:普修羅雙戰(zhàn)士  
本文將詳細(xì)介紹如何在 Spring Boot 中實(shí)現(xiàn)文件上傳、下載、刪除功能,采用的技術(shù)框架包括:Spring Boot 2.4.2、Spring MVC、MyBatis 3.5.6、Druid 數(shù)據(jù)源、JUnit 5 等,文中有詳細(xì)的操作步驟和示例代碼供大家參考,需要的朋友可以參考下

在 Spring Boot 中實(shí)現(xiàn)文件上傳、下載和刪除功能

1. 創(chuàng)建數(shù)據(jù)庫(kù)表

首先,我們需要?jiǎng)?chuàng)建一個(gè)用于存儲(chǔ)文件信息的數(shù)據(jù)庫(kù)表。在本例中,我們將使用 MySQL 數(shù)據(jù)庫(kù),并創(chuàng)建一個(gè)名為 files 的表,包含以下字段:

  • id:文件的唯一標(biāo)識(shí)符,使用自增長(zhǎng)主鍵
  • file_name:文件的名稱
  • file_path:文件類型
  • file_size:文件大小
  • path:存儲(chǔ)文件的文件保存路徑
  • create_time:文件創(chuàng)建時(shí)間

可以使用以下 SQL 語(yǔ)句創(chuàng)建這個(gè)表:

CREATE TABLE `file` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文件ID',
  `file_name` varchar(255) NOT NULL COMMENT '文件名',
  `file_type` varchar(100) NOT NULL COMMENT '文件類型',
  `file_size` varchar(255) NOT NULL COMMENT '文件大小',
  `file_path` varchar(255) NOT NULL COMMENT '文件保存路徑',
  `create_time` datetime NOT NULL COMMENT '文件創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件存儲(chǔ)表';

2. 配置文件的設(shè)置

在本文中,我們將使用 yml 文件進(jìn)行配置。首先,我們需要配置數(shù)據(jù)庫(kù)的連接信息和 MyBatis 的配置。我們還需要配置上傳文件的路徑和允許上傳的文件大小。以下是在 Spring Boot 應(yīng)用程序中添加配置的示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    maxActive: 20
    minIdle: 5
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    validationQuery: select 1 from dual
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall,log4j,config
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  # Mybatis 配置
  mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.example.demo.domain
  # 文件上傳配置
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB
      max-request-size: 100MB
      location: /data/file-server/

其中,datasource 部分是數(shù)據(jù)庫(kù)連接信息的配置。Mybatis 部分配置了 Mybatis 的映射文件和實(shí)體類的位置。servlet 部分用于配置上傳文件的大小和位置。

3. 實(shí)體的創(chuàng)建

在本文中,我們將創(chuàng)建 FileEntity 實(shí)體類,作為對(duì)文件信息的模型。以下是 FileEntity 類的示例:

@Data
public class FileEntity {

    private Integer id;

    private String name;

    private Long size;

    private String type;

    private String path;

    // 下面為 getter 和 setter 方法
}

注意,我們?yōu)槊總€(gè)字段添加了 getter 和 setter 方法,以便可以從數(shù)據(jù)庫(kù)中讀取和寫入文件信息。

4. Mapper 和 DAO 的編寫

在編寫 Mapper 和 DAO 之前,我們需要在 pom.xml 文件中引入 Mybatis 和 Druid。

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.3</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.4</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

創(chuàng)建 Mapper 接口和 XML 文件,使用 Mybatis 注解或 SQL 語(yǔ)句與數(shù)據(jù)庫(kù)進(jìn)行交互。

為了實(shí)現(xiàn)上傳、下載、刪除功能,我們可能需要使用一些第三方包或工具類。以下是一個(gè)簡(jiǎn)單的基于Spring Boot的mapper示例,演示了如何使用七牛云存儲(chǔ)實(shí)現(xiàn)上傳、下載、刪除文件:

import java.io.File;
import java.io.IOException;

import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.storage.BucketManager;
import com.qiniu.common.QiniuException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class FileManager {

    @Value("${qiniu.accessKey}")
    private String accessKey;

    @Value("${qiniu.secretKey}")
    private String secretKey;

    @Value("${qiniu.bucket}")
    private String bucket;

    @Value("${qiniu.basePath}")
    private String basePath;

    private Auth auth;
    private Configuration cfg;
    private UploadManager uploadManager;
    private BucketManager bucketManager;

    public FileManager() {
        auth = Auth.create(accessKey, secretKey);
        cfg = new Configuration(Region.autoRegion());
        uploadManager = new UploadManager(cfg);
        bucketManager = new BucketManager(auth, cfg);
    }

    /**
     * 上傳本地文件到七牛云
     */
    public String uploadFile(String filePath, String fileName) {
        String key = basePath + fileName;
        try {
            Response res = uploadManager.put(filePath, key, auth.uploadToken(bucket), null, null);
            DefaultPutRet putRet = new Gson().fromJson(res.bodyString(), DefaultPutRet.class);
            return putRet.hash;
        } catch (QiniuException e) {
            return null;
        }
    }

    /**
     * 根據(jù)文件名從七牛云刪除文件
     */
    public boolean deleteFile(String fileName) {
        try {
            bucketManager.delete(bucket, basePath + fileName);
            return true;
        } catch (QiniuException ex) {
            return false;
        }
    }

    /**
     * 根據(jù)文件名從七牛云獲取文件信息
     */
    public FileInfo getFileInfo(String fileName) {
        try {
            return bucketManager.stat(bucket, basePath + fileName);
        } catch (QiniuException ex) {
            return null;
        }
    }

    /**
     * 根據(jù)文件名從七牛云下載文件到本地
     */
    public boolean downloadFile(String fileName, String localFilePath) {
        try {
            bucketManager.download(bucket, basePath + fileName, new File(localFilePath));
            return true;
        } catch (QiniuException ex) {
            return false;
        }
    }

}

這個(gè)示例利用了七牛云存儲(chǔ)服務(wù)完成文件的上傳、下載和刪除操作。關(guān)鍵在于使用了七牛云存儲(chǔ)提供的Java SDK,在代碼中我們通過(guò)使用該SDK的函數(shù)實(shí)現(xiàn)對(duì)云上文件的操作。同時(shí),我們需要在我們的Spring Boot項(xiàng)目中配置七牛云存儲(chǔ)服務(wù)的 accessKey、secretKey 和 bucket 等參數(shù)。具體使用方法可以參照七牛云存儲(chǔ)官方文檔進(jìn)行配置和使用。

5. Service 層的編寫

5.1 接口層代碼實(shí)現(xiàn)邏輯

public interface StorageService {

    String save(MultipartFile file);

    Resource load(String filename);

    void delete(String filename);
}

5.2 接口實(shí)現(xiàn)層代碼實(shí)現(xiàn)邏輯

@Service
public class LocalStorageService implements StorageService {

    private final Path storageLocation;

    @Autowired
    public LocalStorageService(@Value("${spring.servlet.multipart.location}") String storageLocation) {
        this.storageLocation = Paths.get(storageLocation);
    }

    @Override
    public String save(MultipartFile file) {
        // 實(shí)現(xiàn)文件保存的業(yè)務(wù)邏輯,如將文件保存到本地文件系統(tǒng)
        // 返回文件保存后的路徑或 URL
        String filename = file.getOriginalFilename();
        Path targetLocation = this.storageLocation.resolve(filename);

        try {
            file.transferTo(targetLocation);
            return targetLocation.toString();
        } catch (IOException e) {
            throw new RuntimeException("Failed to save file: " + filename, e);
        }
    }

    @Override
    public Resource load(String filename) {
        // 實(shí)現(xiàn)文件加載的業(yè)務(wù)邏輯,如從本地文件系統(tǒng)讀取文件并返回
        Path file = this.storageLocation.resolve(filename);
        Resource resource;
        try {
            resource = new UrlResource(file.toUri());
        } catch (MalformedURLException e) {
            throw new RuntimeException("Failed to load file: " + filename, e);
        }

        if (resource.exists() && resource.isReadable()) {
            return resource;
        } else {
            throw new RuntimeException("File not found: " + filename);
        }
    }

    @Override
    public void delete(String filename) {
        // 實(shí)現(xiàn)文件刪除的業(yè)務(wù)邏輯,如從本地文件系統(tǒng)刪除文件
        Path file = this.storageLocation.resolve(filename);
        try {
            Files.delete(file);
        } catch (IOException e) {
            throw new RuntimeException("Failed to delete file: " + filename, e);
        }
    }
}

6. Controller 層的編寫

創(chuàng)建文件上傳控制器類,用于處理文件上傳、下載和刪除請(qǐng)求:

@RestController
public class FileController {

    @Autowired
    private StorageService storageService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        // 調(diào)用 storageService.save(file) 進(jìn)行文件保存的業(yè)務(wù)邏輯
        // 返回處理結(jié)果,如文件的 URL 或保存路徑等
        String filePath = storageService.save(file);
        return "File uploaded successfully!";
    }

    @GetMapping("/download/{filename}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
        // 調(diào)用 storageService.load(filename) 進(jìn)行文件下載的業(yè)務(wù)邏輯
        // 創(chuàng)建 Resource 對(duì)象,將文件流作為響應(yīng)體返回
        Resource fileResource = storageService.load(filename);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"")
                .body(fileResource);
    }

    @DeleteMapping("/delete/{filename}")
    public String deleteFile(@PathVariable String filename) {
        // 調(diào)用 storageService.delete(filename) 進(jìn)行文件刪除的業(yè)務(wù)邏輯
        storageService.delete(filename);
        return "File deleted successfully!";
    }
}

7. 其他注意事項(xiàng)

除了上述提到的注意事項(xiàng)之外,實(shí)現(xiàn)文件上傳、下載和刪除功能時(shí)還應(yīng)注意以下幾點(diǎn):

7.1 文件大小限制: 為了避免惡意用戶上傳過(guò)大的文件導(dǎo)致服務(wù)器資源耗盡,應(yīng)該 對(duì)上傳文件的大小進(jìn)行限制 。你可以在application.yml中使用以下配置設(shè)置上傳文件的最大大?。▎挝粸樽止?jié)):

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    maxActive: 20
    minIdle: 5
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    validationQuery: select 1 from dual
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall,log4j,config
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  # Mybatis 配置
  mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.example.demo.domain
  # 文件上傳配置
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB
      max-request-size: 100MB
      location: /data/file-server/

在上述示例中,文件最大大小被限制為10MB。你可以根據(jù)需要進(jìn)行調(diào)整。

7.2 文件類型限制: 在文件上傳時(shí),你可以通過(guò)文件的擴(kuò)展名或MIME類型進(jìn)行檢查,以確保只接受指定類型的文件。例如,你可以使用Java的正則表達(dá)式或Apache Tika等庫(kù)來(lái)驗(yàn)證文件的擴(kuò)展名或MIME類型。

7.3 安全性考慮: 文件上傳功能可能會(huì)面臨一些安全威脅,如 文件包含漏洞(如路徑遍歷攻擊)、惡意文件上傳或執(zhí)行 ,你應(yīng)該采取相應(yīng)的安全措施來(lái)防止這些威脅。例如,可以對(duì)文件名進(jìn)行過(guò)濾,禁止某些關(guān)鍵詞,或者對(duì)上傳的文件進(jìn)行殺毒掃描。

7.4 跨域請(qǐng)求問(wèn)題: 當(dāng)實(shí)現(xiàn)文件上傳、下載和刪除功能時(shí),你可能會(huì)遇到 跨域請(qǐng)求 問(wèn)題。如果你的前端應(yīng)用與后端應(yīng)用分別部署在不同的域中,你需要在后端應(yīng)用中進(jìn)行跨域配置,以允許來(lái)自其他域的請(qǐng)求。

7.5 文件存儲(chǔ)策略: 對(duì)于大規(guī)模的文件上傳和下載應(yīng)用,僅僅保存文件到本地可能不夠有效或可擴(kuò)展。你可以考慮使用云存儲(chǔ)服務(wù)(如Amazon S3、阿里云OSS)或分布式文件系統(tǒng)(如GlusterFS、Ceph等)來(lái)存儲(chǔ)和管理上傳的文件。

7.6 異步處理: 對(duì)于大文件上傳或下載的情況,可以考慮使用異步處理來(lái)提高性能和用戶體驗(yàn)。你可以利用Spring Boot的異步特性(如@Async注解和DeferredResult對(duì)象)來(lái)實(shí)現(xiàn)異步處理。

在實(shí)現(xiàn)文件上傳、下載和刪除功能時(shí),以上是一些常見(jiàn)的注意事項(xiàng)。根據(jù)你的具體需求和應(yīng)用背景,可能還有其他的注意事項(xiàng)需要注意。希望這些信息能對(duì)你有所幫助。如果有更多問(wèn)題,請(qǐng)隨時(shí)提問(wèn)。

實(shí)現(xiàn)總結(jié)

通過(guò)完成上述步驟,我們成功實(shí)現(xiàn)了在 Spring Boot 中的文件上傳、下載和刪除功能,包括創(chuàng)建數(shù)據(jù)庫(kù)表、文件上傳功能、文件下載功能和文件刪除功能。

在實(shí)現(xiàn)這些功能時(shí),我們還學(xué)習(xí)了一些重要的注意事項(xiàng)。例如,在文件上傳時(shí),需要確保保存文件的目錄存在;在文件下載和刪除時(shí),需要確保文件存在。

綜上所述,Spring Boot 提供了強(qiáng)大的工具和簡(jiǎn)化的方式來(lái)實(shí)現(xiàn)文件上傳、下載和刪除功能,使我們能夠輕松地構(gòu)建功能完善的 Web 應(yīng)用程序。這些功能可以滿足實(shí)際項(xiàng)目中的需求,為用戶提供便捷的文件操作體驗(yàn)。

以上就是SpringBoot中實(shí)現(xiàn)文件上傳、下載、刪除功能的步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot實(shí)現(xiàn)文件上傳、下載、刪除的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • 編寫android撥打電話apk應(yīng)用實(shí)例代碼

    編寫android撥打電話apk應(yīng)用實(shí)例代碼

    這篇文章主要介紹了編寫android撥打電話apk應(yīng)用實(shí)例代碼,十分的實(shí)用,這里分享給大家,有需要的小伙伴可以參考下
    2015-04-04
  • Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié)

    Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié)

    這篇文章主要介紹了Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Java判斷所給年份是平年還是閏年

    Java判斷所給年份是平年還是閏年

    這篇文章主要為大家詳細(xì)介紹了Java判斷所給年份是平年還是閏年,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JVM內(nèi)存結(jié)構(gòu)相關(guān)知識(shí)解析

    JVM內(nèi)存結(jié)構(gòu)相關(guān)知識(shí)解析

    這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)相關(guān)知識(shí)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java實(shí)現(xiàn)石頭剪刀布小游戲

    Java實(shí)現(xiàn)石頭剪刀布小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)石頭剪刀布小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 詳解SpringCloud-OpenFeign組件的使用

    詳解SpringCloud-OpenFeign組件的使用

    這篇文章主要介紹了SpringCloud-OpenFeign組件的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解SimpleDateFormat的線程安全問(wèn)題與解決方案

    詳解SimpleDateFormat的線程安全問(wèn)題與解決方案

    這篇文章主要介紹了SimpleDateFormat的線程安全問(wèn)題與解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 詳解Struts2攔截器機(jī)制

    詳解Struts2攔截器機(jī)制

    這篇文章主要介紹了詳解Struts2攔截器機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • java樹(shù)結(jié)構(gòu)stream工具類的示例代碼詳解

    java樹(shù)結(jié)構(gòu)stream工具類的示例代碼詳解

    Stream 作為 Java 8 的一大亮點(diǎn),它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。今天通過(guò)本文重點(diǎn)給大家介紹java樹(shù)結(jié)構(gòu)stream工具類的示例代碼,感興趣的朋友一起看看吧
    2022-03-03

最新評(píng)論

新乐市| 册亨县| 东乡| 玉环县| 无为县| 龙口市| 广东省| 景宁| 安阳县| 新巴尔虎左旗| 浠水县| 新田县| 绍兴市| 鹤岗市| 和田县| 鄱阳县| 万荣县| 读书| 镶黄旗| 曲阳县| 五大连池市| 四平市| 鄯善县| 满城县| 阜康市| 济阳县| 当雄县| 黄山市| 伊吾县| 白城市| 瑞安市| 五大连池市| 扎鲁特旗| 亚东县| 安达市| 丹寨县| 山阳县| 农安县| 义乌市| 芮城县| 伊宁市|