日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

换乐网GridFS应用分析

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 换乐网GridFS应用分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GridFS是MongoDB提供的一種存儲大文件的規范,文件在存儲的過程中會分成一小塊一小塊(chunks),文件的信息會保存在另外一個集合中。

通過MD5校驗過濾重復上傳文件

在換樂網中,所有用戶上傳的文件都會保存在GridFS中:

Created with Rapha?l 2.1.0開始獲得上傳的文件生成文件的MD5碼GridFS中有該MD5碼?不上傳,返回GridFS中文件ID結束上傳文件,返回GridFS中文件IDyesno

通過MD5校驗,不上傳重復的文件,各種云盤上傳文件時的秒傳也是類似的功能。這樣做的好處就是:服務器中的文件減少了,存儲空間占用降低了,用戶上傳的速度加快了。

關鍵代碼如下:

生成上傳文件的MD5碼:

Md5PasswordEncoder md5PasswordEncoder=new Md5PasswordEncoder(); String md5String="";try {MessageDigest md5Encoder = MessageDigest.getInstance("MD5"); byte[] digest = md5Encoder.digest(file.getBytes());md5String =new BigInteger(1, digest).toString(16);System.out.println(md5String);} catch (IOException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}

文件上傳代碼,上傳之前會檢驗MD5碼

/**保存文件到GirdFS,通過openUploadStream方式* @param bucket 容器名稱* @param file 文件實體* @return 返回FileEntity*/public FileEntity save(FileEntity file){//檢查是否之前已有人上傳過該文件FileEntity filter = new FileEntity();filter.setMd5(file.getMd5());FileEntity result =this.find(filter);if(result!=null){file.setId(result.getId());return file;}//上傳該文件gfsbk = GridFSBuckets.create(db, DEFAULT_BUCKET);GridFSUploadStream uploadStream = gfsbk.openUploadStream(file.getFileName());uploadStream.write(file.getContent());ObjectId id = uploadStream.getFileId();uploadStream.flush();uploadStream.close();file.setId(id);return file;}

從GridFS中獲取圖片顯示在jsp頁面中

因為MD5碼可以標識一個文件,所以網站直接使用MD5碼作為參數獲取圖片,先看下圖片控制器:

@Controller @RequestMapping("/files") public class FileController {//TODO : 考慮安全問題,因為只要一個md5碼就可以得到文件,是否會有漏洞?@Autowiredprivate GirdFSHelper girdFSHelper;@RequestMapping(method=RequestMethod.GET,path="/image/{key}")public void changeInfo(HttpServletResponse response,@PathVariable String key){FileEntity filter = new FileEntity();filter.setMd5(key);FileEntity file = girdFSHelper.download(filter);if(file==null){//TODO 顯示一張默認圖片}else{response.setContentType("image/*");try {response.getOutputStream().write(file.getContent());} catch (IOException e) {e.printStackTrace();}}}}

頁面中<img>的src可以這樣寫:

<img alt="" src="/files/image/9a3e601a54612f89ce6e97cd365a9c65">

如果直接打開這個鏈接,會下載一個文件,所以這個Controller直接再寫一個方法就可以實現其它文件的下載。

總結

以上是生活随笔為你收集整理的换乐网GridFS应用分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。