SpringBoot整合MongoDB實(shí)現(xiàn)文件上傳下載刪除
本文主要內(nèi)容
- MongoDB基礎(chǔ)操作命令示例練習(xí)
- MongoDB居于GridFSTemplate的文件上傳、下載、刪除等操作(工作重點(diǎn)使用)
1. 基礎(chǔ)命令
創(chuàng)建的數(shù)據(jù)庫(kù)名稱(chēng):horse,創(chuàng)建的集合名稱(chēng):blog
# 創(chuàng)建數(shù)據(jù)庫(kù)
use horse
# 刪除當(dāng)前數(shù)據(jù)庫(kù)[horse]
db.dropDatebase()
# 查看所有數(shù)據(jù)庫(kù)
show dbs
# 設(shè)置用戶(hù)的角色和權(quán)限
db.createUser({user:"horse",pwd:"mongo123",roles:[{role:"readWrite",db:"horse"}]})
# 創(chuàng)建指定名稱(chēng)的集合
db.createCollection("blog")
# 刪除指定名稱(chēng)集合
db.blog.drop()
# 查看當(dāng)前數(shù)據(jù)庫(kù)[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({})
# 查詢(xún)文檔
db.blog.find().pretty() # 通過(guò)查詢(xún)方式(沒(méi)有條件,查詢(xún)所有)
db.blog.findOne({"name":"Tom"}) # 查詢(xún)一個(gè)
db.blog.find({"age":{$lt: 23},"name":"Free"}).pretty() # 默認(rèn)and連接查詢(xún)
db.blog.find({$or:[{"age":{$lt:23}},{"name":"Free"}]}).pretty() # or連接查詢(xún)
db.blog.find({"age":{$lt:23},$or:[{"name":"Free"},{"sex":"false"}]}).pretty() # and和or聯(lián)合使用查詢(xún)
db.blog.find().limit(2).skip(1).sort({"age":1}).pretty() # limit、skip、sort聯(lián)合使用(執(zhí)行順序:sort-> skip ->limit)
# 聚合查詢(xún)(參考文檔)
db.blog.aggregate([{$group:{_id:"$age",count:{$sum:1}}}])
2. GridFsTemplate使用
2.1引入pom依賴(lài)
<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工具包食用更佳!??!
/**
* @author Mr.Horse
* @version 1.0
* @description: MongoDB的文件上傳、下載、刪除等基本操作(集合HuTool工具庫(kù))
* @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)文件信息(文件類(lèi)型,文件內(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("文件類(lèi)型錯(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讀取文件并寫(xiě)入響應(yīng)流,頁(yè)面進(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查詢(xún)文件
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)) {
// 打開(kāi)下載流對(duì)象
GridFSDownloadStream fileStream = gridFsBucket.openDownloadStream(file.getObjectId());
// 創(chuàng)建girdFsResource,傳入下載流對(duì)象,獲取流對(duì)象
GridFsResource gridFsResource = new GridFsResource(file, fileStream);
// 寫(xiě)入輸出流
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)在瀏覽器頁(yè)面下載此資源的功能,可結(jié)合js進(jìn)行操作(文件類(lèi)型根據(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類(lèi)型可以設(shè)置為文本類(lèi)型,這里是pdf類(lèi)型
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)文章
基于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 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
關(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)目的方法步驟
這篇文章主要介紹了idea 2020.1.3 手把手教你創(chuàng)建web項(xiàng)目的方法步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
詳解Java編程中統(tǒng)一資源定位符URL的相關(guān)使用
這篇文章主要介紹了Java編程中統(tǒng)一資源定位符URL的相關(guān)使用,是Java網(wǎng)絡(luò)編程中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
jpa多條件查詢(xún)重寫(xiě)Specification的toPredicate方法
這篇文章主要介紹了多條件查詢(xún)重寫(xiě)Specification的toPredicate方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Springboot在有參構(gòu)造方法類(lèi)中使用@Value注解取值
這篇文章主要介紹了Springboot在有參構(gòu)造方法類(lèi)中使用@Value注解取值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

