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

使用Springboot整合GridFS實現文件操作

 更新時間:2021年10月23日 10:15:28   作者:積木i  
這篇文章主要介紹了使用Springboot整合GridFS實現文件操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

GridFsOperations,實現GridFS文件上傳下載刪除

最近學習GridFS,想用它整合springboot弄個文件的上傳下載。

網上查到的很多資料都是使用GridFsTemplate,還有GridFSBucket來實現的,需要各種額外配置Bean。但是看了spring-data-mongodb的官方文檔,以及示例代碼,他們只用到了GridFsOperations,無需其他任何配置。

然后就用GridFsOperations寫了個文件上傳下載的demo,用起來還是很方便的,給大家個參考。

上傳下載刪除功能實現

pom.xml

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

application.properties

#文件上傳下載配置
spring.servlet.multipart.max-file-size=1024MB
spring.servlet.multipart.max-request-size=1024MB

FileController

package com.example.tryRedis.controller;
import static org.springframework.data.mongodb.core.query.Query.*;
import static org.springframework.data.mongodb.gridfs.GridFsCriteria.*;
import com.mongodb.client.gridfs.model.GridFSFile;
import io.swagger.v3.oas.annotations.Parameter;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.gridfs.GridFsOperations;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/file")
public class FileController {
    @Autowired
    GridFsOperations gridFsOperations;
    //上傳文件
    @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Map<String , ObjectId> upload(@Parameter @RequestPart(value = "file") MultipartFile file){
        //開始時間
        long begin = System.nanoTime();
        Map<String,ObjectId> map = new HashMap<>();
        try{
            InputStream streamForUpload = file.getInputStream();
            ObjectId objectId = gridFsOperations.store(streamForUpload,file.getOriginalFilename(),file.getContentType());
            //上傳結束
            long end = System.nanoTime();
            long time = end-begin;
            System.out.println("本次上傳共耗時: "+ time);
            System.out.println("上傳成功!文件名: "+file.getOriginalFilename()+". 文件ID: "+objectId);
            map.put(file.getOriginalFilename(),objectId);
        }catch (Exception e){
            e.printStackTrace();
        }
        return map;
    }
    //查詢并下載文件
    @GetMapping("/download")
    public String download(String filename, HttpServletResponse response) throws IOException {
        //開始時間
        long begin = System.nanoTime();
        //查詢文件
        GridFSFile result  = gridFsOperations.findOne(query(whereFilename().is(filename)));
        GridFsResource gridFsResource= gridFsOperations.getResource(result);
        String contentType = gridFsResource.getContentType();
        System.out.println("contentType: "+contentType);
        System.out.println("filename: "+gridFsResource.getFilename());
        response.reset();
        response.setContentType(contentType);
        //注意: 如果沒有下面這行設置header, 結果會將文件的內容作為響應的 body 直接輸出在頁面上, 而不是下載文件
        response.setHeader("Content-Disposition","attachment;filename="+filename);  //指定下載文件名
        ServletOutputStream outputStream = response.getOutputStream();
        InputStream is = gridFsResource.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len=is.read(bytes))!=-1){
            outputStream.write(bytes,0,len);
        }
        is.close();
        outputStream.close();
        //下載結束
        long end = System.nanoTime();
        long time = end-begin;
        System.out.println("本次下載共耗時: "+ time);
        return contentType;
    }
    @DeleteMapping("/delete")
    public String deleteFile(@Parameter @RequestParam("filename") String filename){
        gridFsOperations.delete(query(whereFilename().is(filename)));
        return "delete success";
    }
}

測試

上傳

在這里插入圖片描述 在這里插入圖片描述

下載

紅色圈內點擊download就可以下載啦?;蛘咴诘刂窓谥苯虞斎雔ocalhost:8080/file/download?filename=todo.txt 也可以直接下載文件(這里的todo.txt是我測試的文件,你們填自己上傳的文件名,不要忘了加上后綴名?。?/p>

在這里插入圖片描述

刪除

在這里插入圖片描述

上面這些上傳刪除功能測試的時候,大家也可以結合mongodb的數據庫去看看。

在這里插入圖片描述

上傳的文件類型不限,大小嘛,看你properties文件里設置的上限是多大了。我拿700MB的文件上傳了也ok,然后在數據庫中會被分成很多個塊進行存儲。具體存儲的細節(jié)和原理,網上文檔很多,這兒就不嘮叨嘞。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MyBatis自定義類型轉換器實現加解密

    MyBatis自定義類型轉換器實現加解密

    這篇文章主要介紹了MyBatis自定義類型轉換器實現加解密的相關資料,需要的朋友可以參考下
    2016-07-07
  • java讀寫oracle的blob字段示例

    java讀寫oracle的blob字段示例

    這篇文章主要介紹了java讀寫oracle的blob字段示例,需要的朋友可以參考下
    2014-02-02
  • Mybatis中Collection集合標簽的使用詳解

    Mybatis中Collection集合標簽的使用詳解

    這篇文章主要介紹了Mybatis中Collection集合標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java中的HashMap和Hashtable區(qū)別解析

    Java中的HashMap和Hashtable區(qū)別解析

    這篇文章主要介紹了Java中的HashMap和Hashtable區(qū)別解析,HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的區(qū)別,主要的區(qū)別有線程安全性、同步和速度,需要的朋友可以參考下
    2023-11-11
  • Java線程同步及實現方法詳解

    Java線程同步及實現方法詳解

    這篇文章主要介紹了Java線程同步及實現方法詳解,當我們有多個線程要同時訪問一個變量或對象時,如果這些線程中既有讀又有寫操作時,就會導致變量值或對象的狀態(tài)出現混亂,從而導致程序異常,需要的朋友可以參考下
    2023-11-11
  • 淺談MyBatis執(zhí)行SQL的兩種方式

    淺談MyBatis執(zhí)行SQL的兩種方式

    本文介紹MyBatis執(zhí)行SQL語句的2種方式,主要是SqlSession和Mapper接口以及它們的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • Java 線程池詳解及實例代碼

    Java 線程池詳解及實例代碼

    這篇文章主要介紹了Java 線程池的相關資料,并符實例代碼,幫助大家學習參考,需要的朋友可以參考下
    2016-09-09
  • Java 語言守護線程 Daemon Thread使用示例詳解

    Java 語言守護線程 Daemon Thread使用示例詳解

    這篇文章主要為大家介紹了Java 語言守護線程 Daemon Thread使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Spring事務管理方法步驟解析

    Spring事務管理方法步驟解析

    這篇文章主要介紹了Spring事務管理方法步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • mybatis使用foreach查詢不出結果也不報錯的問題

    mybatis使用foreach查詢不出結果也不報錯的問題

    這篇文章主要介紹了mybatis使用foreach查詢不出結果也不報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

郁南县| 康平县| 夏河县| 赤城县| 板桥市| 离岛区| 翁源县| 平顺县| 绥江县| 汾阳市| 孟津县| 噶尔县| 惠安县| 嘉鱼县| 鄯善县| 历史| 疏附县| 德州市| 兴文县| 山丹县| 潞城市| 长子县| 太谷县| 儋州市| 大足县| 定安县| 海口市| 老河口市| 固阳县| 达拉特旗| 阿拉善左旗| 元阳县| 永善县| 沅陵县| 连江县| 弋阳县| 沾益县| 淅川县| 建瓯市| 大同市| 平塘县|