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

SpringBoot整合MongoDB實(shí)現(xiàn)文件上傳下載刪除

 更新時(shí)間:2021年05月03日 09:02:16   作者:JackHorse  
這篇文章主要介紹了SpringBoot整合MongoDB實(shí)現(xiàn)文件上傳下載刪除的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下

本文主要內(nèi)容

  • MongoDB基礎(chǔ)操作命令示例練習(xí)
  • MongoDB居于GridFSTemplate的文件上傳、下載、刪除等操作(工作重點(diǎn)使用)

1. 基礎(chǔ)命令

創(chuàng)建的數(shù)據(jù)庫名稱:horse,創(chuàng)建的集合名稱:blog

# 創(chuàng)建數(shù)據(jù)庫
use horse
# 刪除當(dāng)前數(shù)據(jù)庫[horse]
db.dropDatebase()
# 查看所有數(shù)據(jù)庫
show dbs

 # 設(shè)置用戶的角色和權(quán)限
db.createUser({user:"horse",pwd:"mongo123",roles:[{role:"readWrite",db:"horse"}]})

# 創(chuàng)建指定名稱的集合
db.createCollection("blog")
# 刪除指定名稱集合
db.blog.drop()
# 查看當(dāng)前數(shù)據(jù)庫[horse]中所有集合
show collections


# 插入文檔
db.blog.insert({"name":"Tom","age":23,"sex":true})
db.blog.insertOne({"name":"Top","age":20,"sex":true})
db.blog.insertMany([{"name":"Jerry","age":22,"sex":false},{"name":"Free","age":21,"sex":true}])


# 更新文檔
db.blog.update({"name":"Top"},{$set:{"name":"TopSun"}},{multi:true})


# 刪除文檔
db.blog.remove({"sex":false}, true)
db.blog.deleteMany({"age":23})
db.blog.deleteOne({"age":22})
# 刪除集合所有數(shù)據(jù)
db.blog.deleteMan({})


# 查詢文檔
db.blog.find().pretty()   # 通過查詢方式(沒有條件,查詢所有)
db.blog.findOne({"name":"Tom"})   # 查詢一個(gè)
db.blog.find({"age":{$lt: 23},"name":"Free"}).pretty()   # 默認(rèn)and連接查詢
db.blog.find({$or:[{"age":{$lt:23}},{"name":"Free"}]}).pretty()   # or連接查詢
db.blog.find({"age":{$lt:23},$or:[{"name":"Free"},{"sex":"false"}]}).pretty() # and和or聯(lián)合使用查詢
db.blog.find().limit(2).skip(1).sort({"age":1}).pretty()   # limit、skip、sort聯(lián)合使用(執(zhí)行順序:sort-> skip ->limit)

# 聚合查詢(參考文檔)
db.blog.aggregate([{$group:{_id:"$age",count:{$sum:1}}}])

2. GridFsTemplate使用

2.1引入pom依賴

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

2.2 配置yml

spring:
  data:
    mongodb:
      host: *.*.*.*
      username: ***
      password: ***
      database: ***
      port: 27017
 # 設(shè)置文件上傳的大小限制
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB

2.3 上傳下載刪除

面對(duì)疾風(fēng)吧:接合HuTool工具包食用更佳!?。?/p>

/**
 * @author Mr.Horse
 * @version 1.0
 * @description: MongoDB的文件上傳、下載、刪除等基本操作(集合HuTool工具庫)
 * @date 2021/4/29 9:53
 */
@Validated
@Controller
@RequestMapping("/mongo")
public class MongoUploadController {

    private static Logger logger = LoggerFactory.getLogger(MongoUploadController.class);

    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Autowired
    private MongoTemplate mongoTemplate;

    private static final List<String> CONTENT_TYPES = Arrays.asList("image/gif", "image/jpeg", "image/jpg", "image/png");

    /**
     * MongoDB文件上傳(圖片上傳)
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public ResponseEntity<String> fileUpload(@RequestParam("file") MultipartFile file) {
        try {
            // 校驗(yàn)文件信息(文件類型,文件內(nèi)容)
            String originalFilename = file.getOriginalFilename();
            if (StrUtil.isBlank(originalFilename)) {
                return ResponseEntity.badRequest().body("參數(shù)錯(cuò)誤");
            }
            String contentType = file.getContentType();
            if (!CONTENT_TYPES.contains(contentType)) {
                return ResponseEntity.badRequest().body("文件類型錯(cuò)誤");
            }
            InputStream inputStream = file.getInputStream();
            BufferedImage bufferedImage = ImageIO.read(inputStream);
            if (ObjectUtil.isEmpty(bufferedImage)) {
                return ResponseEntity.badRequest().body("文件內(nèi)容錯(cuò)誤");
            }

            // 文件重命名
            String suffix = FileNameUtil.getSuffix(originalFilename);
            String fileName = IdUtil.simpleUUID().concat(".").concat(suffix);

            // 文件上傳,返回ObjectId
            ObjectId objectId = gridFsTemplate.store(inputStream, fileName, contentType);
            return StrUtil.isBlank(String.valueOf(objectId)) ? ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上傳失敗") : ResponseEntity.ok(String.valueOf(objectId));
        } catch (IOException e) {
            return ResponseEntity.badRequest().body("文件上傳異常");
        }
    }


    /**
     * 根據(jù)ObjectId讀取文件并寫入響應(yīng)流,頁面進(jìn)行進(jìn)行相關(guān)操作,可以進(jìn)行文件的下載和展示
     *
     * @param objectId
     */
    @GetMapping("/read")
    public void queryFileByObjectId(@RequestParam("objectId") @NotBlank(message = "ObjectId不能為空") String objectId, HttpServletResponse response) {
        // 根據(jù)objectId查詢文件
        GridFSFile file = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(objectId)));
        // 創(chuàng)建一個(gè)文件桶
        GridFSBucket gridFsBucket = GridFSBuckets.create(mongoTemplate.getDb());
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            if (ObjectUtil.isNotNull(file)) {
                // 打開下載流對(duì)象
                GridFSDownloadStream fileStream = gridFsBucket.openDownloadStream(file.getObjectId());
                // 創(chuàng)建girdFsResource,傳入下載流對(duì)象,獲取流對(duì)象
                GridFsResource gridFsResource = new GridFsResource(file, fileStream);
                // 寫入輸出流
                inputStream = gridFsResource.getInputStream();
                outputStream = response.getOutputStream();
                byte[] bytes = new byte[1024];
                if (inputStream.read(bytes) != -1) {
                    outputStream.write(bytes);
                }
            }
        } catch (IOException e) {
            logger.error("文件讀取異常: {}", e.getMessage());
        } finally {
            IoUtil.close(outputStream);
            IoUtil.close(inputStream);
        }
    }

    /**
     * 根據(jù)ObjectId刪除文件
     *
     * @param objectId
     * @return
     */
    @DeleteMapping("/remove")
    public ResponseEntity<String> removeFileByObjectId(@RequestParam("objectId") @NotBlank(message = "ObjectId不能為空") String objectId) {
        gridFsTemplate.delete(new Query(Criteria.where("_id").is(objectId)));
        return ResponseEntity.ok("刪除成功");
    }

}

如果需要實(shí)現(xiàn)在瀏覽器頁面下載此資源的功能,可結(jié)合js進(jìn)行操作(文件類型根據(jù)具體業(yè)務(wù)需求而定)。主要實(shí)現(xiàn)代碼如下所示:

    downloadNotes(noteId) {
      axios({
        url: this.BASE_API + '/admin/mongo/file/query/' + noteId,
        method: 'get',
        responseType: 'arraybuffer',
        params: { type: 'download' }
      }).then(res => {
        // type類型可以設(shè)置為文本類型,這里是pdf類型
        const pdfUrl = window.URL.createObjectURL(new Blob([res.data], { type: `application/pdf` }))
        const fname = noteId // 下載文件的名字
        const link = document.createElement('a')
        link.href = pdfUrl
        link.setAttribute('download', fname)
        document.body.appendChild(link)
        link.click()
        URL.revokeObjectURL(pdfUrl) // 釋放URL 對(duì)象
      })
    }

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

相關(guān)文章

  • Maven繼承與聚合詳解及作用介紹

    Maven繼承與聚合詳解及作用介紹

    繼承關(guān)系中,分為父模塊與子模塊,父模塊也被稱為 parent 模塊,子模塊會(huì)繼承父模塊的依賴,父模塊中也可以設(shè)置依賴管理器,供子模塊選擇是否需要某些依賴
    2022-08-08
  • Java中的ThreadLocal詳解

    Java中的ThreadLocal詳解

    THreadLocalMap中的Entry的key使用的是ThreadLocal對(duì)象的弱引用,在沒有其他地方對(duì)ThreadLoca依賴,ThreadLocalMap中的ThreadLocal對(duì)象就會(huì)被回收掉,但是對(duì)應(yīng)的不會(huì)被回收,具體內(nèi)容請(qǐng)和小編一起看下面文章詳情
    2021-09-09
  • 基于Java設(shè)計(jì)一個(gè)短鏈接生成系統(tǒng)

    基于Java設(shè)計(jì)一個(gè)短鏈接生成系統(tǒng)

    相信大家在生活中會(huì)收到很多短信,而這些短信都有一個(gè)特點(diǎn)是鏈接很短。這些鏈接背后的原理是什么呢?怎么實(shí)現(xiàn)的?小編今天就帶你們?cè)敿?xì)了解一下
    2021-12-12
  • 詳解spring security 配置多個(gè)AuthenticationProvider

    詳解spring security 配置多個(gè)AuthenticationProvider

    這篇文章主要介紹了詳解spring security 配置多個(gè)AuthenticationProvider ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 關(guān)于dubbo的RPC和RESTful性能及對(duì)比

    關(guān)于dubbo的RPC和RESTful性能及對(duì)比

    這篇文章主要介紹了關(guān)于dubbo的RPC和RESTful性能及對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • idea2020.1.3 手把手教你創(chuàng)建web項(xiàng)目的方法步驟

    idea2020.1.3 手把手教你創(chuàng)建web項(xiàng)目的方法步驟

    這篇文章主要介紹了idea 2020.1.3 手把手教你創(chuàng)建web項(xiàng)目的方法步驟,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 詳解Java編程中統(tǒng)一資源定位符URL的相關(guān)使用

    詳解Java編程中統(tǒng)一資源定位符URL的相關(guān)使用

    這篇文章主要介紹了Java編程中統(tǒng)一資源定位符URL的相關(guān)使用,是Java網(wǎng)絡(luò)編程中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • SpringBoot整合Web之AOP配置詳解

    SpringBoot整合Web之AOP配置詳解

    面向切面編程(aspect-oriented programming,AOP)主要實(shí)現(xiàn)的目的是針對(duì)業(yè)務(wù)處理過程中的切面進(jìn)行提取,諸如日志、事務(wù)管理和安全這樣的系統(tǒng)服務(wù),從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率
    2022-08-08
  • jpa多條件查詢重寫Specification的toPredicate方法

    jpa多條件查詢重寫Specification的toPredicate方法

    這篇文章主要介紹了多條件查詢重寫Specification的toPredicate方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Springboot在有參構(gòu)造方法類中使用@Value注解取值

    Springboot在有參構(gòu)造方法類中使用@Value注解取值

    這篇文章主要介紹了Springboot在有參構(gòu)造方法類中使用@Value注解取值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

天台县| 合山市| 英超| 泽州县| 金湖县| 静宁县| 赣榆县| 化州市| 满洲里市| 德庆县| 平昌县| 松原市| 张家口市| 原阳县| 孟津县| 大姚县| 泽库县| 广宁县| 锦州市| 高要市| 霍林郭勒市| 靖边县| 永川市| 肥城市| 平山县| 梓潼县| 屏边| 都江堰市| 高台县| 广德县| 铜川市| 崇义县| 武安市| 灯塔市| 高青县| 昌黎县| 微博| 平山县| 香港| 吐鲁番市| 冷水江市|