1. 程式人生 > >七、springBoot 簡單優雅是實現檔案上傳和下載

七、springBoot 簡單優雅是實現檔案上傳和下載

前言

好久沒有更新spring Boot 這個專案了。最近看了一下docker 的知識,後期打算將spring boot 和docker 結合起來。剛好最近有一個上傳檔案的工作呢,剛好就想起這個腳手架,將檔案上傳和下載整理進來。

配置

在application.properties 中增加上傳檔案存放的路徑配置

#檔案上傳目錄
file.upload.url=E:/test

controller 層

上傳檔案和下載檔案都比較簡單,我們就直接在controller層來編寫。也不用在pom.xml 中增加什麼依賴。所以直接上程式碼。
在controller 包下建立一個file包,在file 包下建立一個FileController 類。

@RestController
@RequestMapping("file")
@Slf4j
public class FileController {
    @Value("${file.upload.url}")
    private String uploadFilePath;
        
        @RequestMapping("/upload")
    public String httpUpload(@RequestParam("files") MultipartFile files[]){
        JSONObject object=new JSONObject();
        for(int i=0;i<files.length;i++){
            String fileName = files[i].getOriginalFilename();  // 檔名
            File dest = new File(uploadFilePath +'/'+ fileName);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            try {
                files[i].transferTo(dest);
            } catch (Exception e) {
                log.error("{}",e);
                object.put("success",2);
                object.put("result","程式錯誤,請重新上傳");
                return object.toString();
            }
        }
        object.put("success",1);
        object.put("result","檔案上傳成功");
        return object.toString();
    }

}

上面的程式碼看起來有點多,其實就是一個上傳的方法,首先通過 MultipartFile 接收檔案。這裡我用的是file[] 陣列接收檔案,這是為了相容多檔案上傳的情況,如果只用file 接收,然後在介面上傳多個檔案的話,只會接收最後一個檔案。這裡大家注意一下。看自己的需求,我這裡相容多檔案所以用陣列接收。

然後遍歷files 獲取檔案,下面這段程式碼是判斷檔案在所在目錄是否存在,如果不存在就建立對應的目錄。

 File dest = new File(uploadFilePath +'/'+ fileName);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
 files[i].transferTo(dest);

就是將檔案存放到對應的伺服器,這裡有一點需要說明一下,如果我們上傳重複的檔案會怎麼樣麼?上傳重複的檔案不會報錯,後上傳的檔案會直接覆蓋已經上傳的檔案。

整體程式碼就是這樣。現在就可以實現檔案的上傳操作。

測試

我們寫好之後,基本上傳功能就已經實現了,我們現在來測試一下。啟動專案後我們用postman 請求,因為我們需要上傳檔案,用get 方式請求不了。

可以看到檔案上傳成功了,由此可見,springboot檔案上傳一個方法就搞定了。

檔案下載

其實檔案下載,不太建議用介面做,因為檔案下載一般都是下載一些靜態檔案,我們可以先將檔案處理好,然後通過Nginx 服務下載靜態檔案,這樣速度會快很多。但是這裡我們還是寫一下。程式碼也很簡單,就一個方法,也寫在fileController 類中

 @RequestMapping("/download")
    public String fileDownLoad(HttpServletResponse response, @RequestParam("fileName") String fileName){
        File file = new File(downloadFilePath +'/'+ fileName);
        if(!file.exists()){
            return "下載檔案不存在";
        }
        response.reset();
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        response.setContentLength((int) file.length());
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName );

        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));) {
            byte[] buff = new byte[1024];
            OutputStream os  = response.getOutputStream();
            int i = 0;
            while ((i = bis.read(buff)) != -1) {
                os.write(buff, 0, i);
                os.flush();
            }
        } catch (IOException e) {
            log.error("{}",e);
            return "下載失敗";
        }
        return "下載成功";
    }

程式碼也很簡單,就是根據檔名判斷是否存在檔案,不存在就提示沒有檔案,存在就將檔案下載下來。response設定返回檔案的格式,以檔案流的方式返回,採用utf-8 字符集,設定下載後的檔名。然後就是以檔案流的方式下載檔案了。

測試的話也簡單,我們啟動專案,訪問介面
http://localhost:9090/zlflovemm/file/download?fileName=11 http://localhost:9090/zlflovemm/file/download?fileName=1.rar


可以看到如果檔案存在,會直接下載,不會提示下載成功或者失敗。

# 刪除檔案

刪除檔案是很簡單的,我這裡講一下刪除檔案下所有資料夾和檔案。並做一個定時任務,每天清理一次。
```

@Scheduled(cron="0 0 3 * * ?")
private void deleteFiles(){
    deleteFile(new File(deleteFilePath));
}

public void deleteFile(File file){
    //判斷檔案不為null或檔案目錄存在
    if (file == null || !file.exists()){
        log.info("暫無檔案");
        return;
    }
    //取得這個目錄下的所有子檔案物件
    File[] files = file.listFiles();
    //遍歷該目錄下的檔案物件
    for (File f: files){
        //列印檔名
        String name = f.getName();
        log.info(name);
        //判斷子目錄是否存在子目錄,如果是檔案則刪除
        if (f.isDirectory()){
            deleteFile(f);
        }else {
            f.delete();
        }
    }
    //刪除空資料夾  for迴圈已經把上一層節點的目錄清空。
    file.delete();
}

```

# 番外
到此為止,我們常用的映象和容器的操作就會使用啦。都是一些命令。忘記的可以--help 檢視一下。

好了,就說這麼多啦
程式碼上傳到github:
https://github.com/QuellanAn/zlflovemm

後續加油♡

歡迎大家關注個人公眾號 "程式設計師愛酸奶"

分享各種學習資料,包含java,linux,大資料等。資料包含視訊文件以及原始碼,同時分享本人及投遞的優質技術博文。

如果大家喜歡記得關注和分享喲❤

相關推薦

springBoot 簡單優雅實現檔案下載

前言 好久沒有更新spring Boot 這個專案了。最近看了一下docker 的知識,後期打算將spring boot 和docker 結合起來。剛好最近有一個上傳檔案的工作呢,剛好就想起這個腳手架,將檔案上傳和下載整理進來。 配置 在application.properties 中增加上傳檔案存放的路徑配

SpringBoot實現檔案下載

SpringBoot後臺如何實現檔案上傳下載? 最近做的一個專案涉及到檔案上傳與下載。前端上傳採用百度webUploader外掛。有關該外掛的使用方法還在研究中,日後整理再記錄。本文主要介紹SpringBoot後臺對檔案上傳與下載的處理。 單檔案上傳 // 單檔案上傳 @RequestMapp

ASP.NET實現檔案下載

###### 本文的開發配置 ###### .NET版本:.NET Framework 4.0 開發環境:Microsoft Visual Studio 2013 瀏覽器:IE、Chrome、FireFox等都行   1、搭建網站結構 建立一個新的目錄

Java實現檔案下載

上面的博文我寫了Java對檔案操作的功能https://blog.csdn.net/qq_24380635/article/details/83273359,這次記錄一下檔案上傳和下載的功能。看看兩者有什麼不同,就可以知道檔案操作和檔案上傳下載有什麼不同了。我也是一點點懂,也

Android Retrofit2.0實現檔案下載

這篇主要介紹retrofit框架的上傳檔案到伺服器和從伺服器下載功能的實現 上傳檔案到伺服器 首先 retrofit2.0之前上傳檔案到伺服器需要一個叫TypedFile這個類,但是在2.0版本,這個類被取消了,因為2.0以後,retrofit內部集成了okhttp

spring實現檔案下載 完整方案

1. 簡介 提供基於spring實現檔案(筆記附件)的上傳和下載的完整方案。方案將檔案上傳,並將檔名稱作為欄位與關聯的筆記繫結在一起,更新筆記在資料庫中的記錄。顯示筆記時,根據筆記所繫結的檔名生成下載

Retrofit實現檔案下載【二】

概述 通過前一篇的部落格介紹,我們已經對Retrofit的使用有了一個大概的瞭解,今天來講講利用Retrofit進行檔案的上傳和下載 檔案上傳 伺服器使用的是SSH框架,因此這裡是以struts2的方式來獲取資料的,我這裡定義了三個欄位用來接收上傳過來

基於tobato的fastdfs與spring boot整合實現檔案下載

專案結構: pom.xml檔案新增配置: <!-- fastdfs --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastd

如何在基於Java的Web專案中實現檔案下載

在Sevlet 3 以前,Servlet API中沒有支援上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的檔案,我們推薦使用Apac

在SpringMVC框架中實現檔案下載

首先在springmvc.xml中配置檔案上傳的屬性 <!-- 檔案上傳的屬性值 --> <bean id="multipartResolver" class="org.springframework.web.multi

使用springMVC實現檔案下載檔案下載

接上一篇,檔案下載需要獲取下載檔案的儲存路徑,這裡只是手動填入,如果是在具體專案中,可以把檔名和上傳後的儲存路徑儲存在資料庫中。然後增加一個檔案列表的頁面展示檔名和檔案路徑,然後點選下載的時候把相應的

springmvc實現檔案下載

springmvc實現檔案上傳的步驟: 1.頁面上,通過input來準備file元件,該標籤,必須給定name屬性值(該name不能和實體類的屬性名一致)同時,要求form表單必須給定一個屬性:enctype="multipart/form-data"<form a

spring實現檔案下載完整方案

1. 簡介 提供基於spring實現檔案(筆記附件)的上傳和下載的完整方案。方案將檔案上傳,並將檔名稱作為欄位與關聯的筆記繫結在一起,更新筆記在資料庫中的記錄。顯示筆記時,根據筆記所繫結的檔名生成下載路徑,提交給服務端完成下載。 2. 檔案上傳 2. 1 前端 在html中插入一個表單用於提交檔案 &

Java Springboot結合FastDFS實現檔案以及根據圖片url將圖片至圖片伺服器

上一篇文章我們已經講解了如何搭建FastDFS圖片伺服器,環境我們準備好了現在就讓我們開始與Java結合將他應用到實際的專案中吧。本篇文章我們將會展示上傳圖片到FastDFS圖片伺服器以及通過外網的圖片url將圖片上傳至我們自己的圖片伺服器中。 1.建立springbo

SpringBoot實現檔案訪問

用springboot實現檔案的上傳和訪問。檔案的上傳首先會用到相關的工具類,Jar包, Maven專案需要jar包: <!-- https://mvnrepository.com/artifact/commons-io/commons-io    IO 檔案流需要

springboot基於MultipartFile實現檔案

MultipartFile是springMVC的jar包,不需要其它座標,可以直接使用 一. 新建controller @RequestMapping("/uploadTest1") public String test1(@RequestParam("

用socket自定義簡單協議實現檔案與接受

一個上傳的資料包,主要包含檔案頭和檔案內容倆部分,主要按下面的格式,傳送: "File-Name:xxxxxx.zip;File-Type:exe;File-Length:1029292\r\n" ------檔案內容--------- 1、服務端的檔案接受服務 MySoc

使用jsp/servlet簡單實現檔案下載

public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

使用牛雲JS-SDK實現檔案

1、新增js檔案<script type="text/javascript" src="/resources/js/jquery/jquery-1.7.min.js"></script> <script type="text/javascript

SpringBoot專案實現檔案郵件傳送

前言 本篇文章主要介紹的是SpringBoot專案實現檔案上傳和郵件傳送的功能。 SpringBoot 檔案上傳 說明:如果想直接獲取工程那麼可以直接跳到底部,通過連結下載工程程式碼。 開發準備 環境要求 JDK:1.8 SpringBoot:1.5.9.RELEASE 首先還是Maven的相關依賴: pom