ディレクトリナビゲーション
序文
前の章では、分散キャッシングテクノロジーに関して、「Redis分散キャッシングテクノロジーの使用と原則」を分析しました。このセクションでは、引き続きMongoDBについて説明します。
MongoDBについては、合計5つのセクションがあります。
- MongoDBのアプリケーションシナリオと実装原則
- MongoDBの一般的なコマンドと構成
- MongoDBに基づく手書きORMフレームワーク
- MongoDBに基づいてネットワーククラウドディスクの戦闘を実現
- MongoDBの高可用性とMongoDB4.0の新機能
基本的な実現アイデアの紹介
一般的なネットワークディスクは、Baiduネットワークディスク、Tencentマイクロディスク、360ネットワークディスク、Ali OSS、Qiniu Cloud ...
このセクションの内容は、MongoDBを介して特定のディスクのファイルをアップロードおよびダウンロードする基本的な機能を実現することです〜
陰謀
-
なぜMongoDBを使用してクラウドディスクを実装するのですか?
GridFSはJavaでキャッシュミドルウェアとして使用され、クラウドディスクシナリオに適した構造化された非リレーショナルデータベースです。 -
なぜクラウドディスクが存在するのですか?
私自身のプロジェクトは、変換後
、フロントエンドにネイティブのBootstrap + layui、バックエンドにSpringBoot、データベースにMongoDBを使用して、完全にサーブレット解除フレームワーク(SpringBoot)が実装されます。 -
個人的な経験の
共有自分の経験を共有することは、会社のすべてのプロジェクトで使用されるファイルストレージの依存関係に相当します
技術的な準備:SpringBoot 2.0 + MongoDB 4.0 + Bootstrap3.0
デザインのアイデア
ファイル分類
パブリックリソースpublic:/誰でも共有
ごみ箱recycle:/権限によると、誰もがごみ箱を持ってい
ますMy files my:/各ユーザーは仮想クラウドディスクを持っています
最終的な効果の写真:
データの分離
フォルダの説明
- 私のファイル:各人はフォルダに対応し、それ以上のものはありません(通常の文字列の文字列です)
- 匿名ユーザー匿名:このセクションのコードは匿名ログインを使用します
- 登録ユーザー:通常、シングルサインオンによって実装されますが、まだ開発されていません
ルールの説明
は次のように規定しています:ルートディレクトリパス/
サブ
ディレクトリ/ XX / XXx / AA / BB / EEサブディレクトリ/ XX / XXx / AA / DD / CC
サブディレクトリ/ XX / XXx / CC / DD
パスには/ XX / XXx / AA /が含まれます
フォルダを作成するとき、同じレベルのディレクトリで名前を重複させることはできません
MongoDBファイルストレージは危険ですか?
ディスク上のディレクトリ内のファイル数が制限されているため、ユーザー登録数に達しました。
効率的なストレージソリューション
- ディスクストレージ、MongoDBストレージ
- 仮想空間管理
- 複数のデータソース操作
主な機能
- ログインしてログアウトする
- アップロード
- 下ダウンロード(FlashReader、swf、Word、PDF、Excel、MP4、MP3、PPT)
- プレビュー
- お問い合わせ
- 無制限のカタログ
- FFMPEG /マルチメディア変換WordからSwf、MP4 / WVM ... /MP4.H264
コアコードデモ
データベース設計
手書きのコアビジネスコード
ファイル自体の操作、プレビュー、ダウンロード用の.jsonajaxインタラクティブformat.file
動的と静的の分離を行う場合、Nginxを使用していくつかの機能を引き受けます
一般的に、ファイルストレージには3つのタイプがあります
- ディスクに直接書き込み、nginxを介してアクセスします。明らかに、パフォーマンスが低下します
- FastDFS推奨ソリューションなどの分散ファイルシステムは、最高のパフォーマンスを発揮し、拡張が容易で、拡張が困難です。
- MongoDB、キャッシュとして使用します。便宜上、お勧めしません(たまたま自分でやったからです)
ログイン/ログアウト
ログインする:
@RequestMapping("/login.json")
public ResponseEntity login(@RequestParam("loginName") String loginName,
@RequestParam("loginPass") String loginPass,
@RequestParam("iframe") String iframe,
@RequestParam("callback") String callback,
@RequestParam("jumpto") String jumpto){
ResultMsg<?> data = memberService.login(loginName,loginPass);
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
String json = JSON.toJSONString(data);
if(!(null == jumpto || "".equals(jumpto))) {
JSONObject obj = JSON.parseObject(json);
obj.getJSONObject("data").put("jumpto", jumpto);
json = obj.toString();
}
if("1".equals(iframe)) {
StringBuffer returnStr = new StringBuffer();
returnStr.append("window.parent." + ((callback == null) ? "callback" : callback) + "(" + json + ");");
returnStr.insert(0, "<script type=\"text/javascript\">").append("</script>");
return ResponseEntity
.ok()
.headers(headers)
.contentType(MediaType.parseMediaType("text/html"))
.body(returnStr.toString());
}else{
return ResponseEntity
.ok()
.headers(headers)
.contentType(MediaType.parseMediaType("application/json"))
.body(((callback == null) ? json : (callback +"(" + json + ")")));
}
}
ログアウト:
@GetMapping("/logout.json")
public Mono<Object> logout(){
ResultMsg<?> result = memberService.logout(null);
return Mono.just(result);
}
効果のデモンストレーション:
ファイルをアップロードする
@RequestMapping("/upload/progress.json")
public ResponseEntity progress(@RequestParam("X-Progress-ID") String progressId,
@RequestParam("callback") String callback){
Progress progress = new Progress();
progress.setFinish(1);
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
String json = JSON.toJSONString(progress);
return ResponseEntity
.ok()
.headers(headers)
.contentType(MediaType.parseMediaType("application/json"))
.body(((callback == null) ? json : (callback +"(" + json + ")")));
}
正常にアップロードした後:
この時点で、効果を確認するためにマルチレベルフォルダーを作成します:
作成されたフォルダーは実際には一意のIDがプレフィックスとして付けられた文字列の文字列であり、プレフィックスはMD5によって暗号化されていることをここで説明します
そして、アップロードプロセス中に、ファイルをローカルディスクに永続化します。
次に、ローカルディスクディレクトリを開きます
。d41d8cd98f00b204e9800998ecf8427eこれはファイルのIDです。
対応する3文字のディレクトリもローカルディスクにあります。実際、転送されたファイルはローカルディレクトリにも保持されています。
ディスクの読み取りおよび書き込みパフォーマンスは、メモリの読み取りおよび書き込みパフォーマンスよりも高くなります。
ダウンロード
@RequestMapping("/download/{id:\\w+}.file")
public ResponseEntity download(@PathVariable(name="id") String id){
ResultMsg<?> resultMsg = uFileService.download(ExplorerConstants.ANONYMOUS,id);
File file = (File) resultMsg.getData();
MimetypesFileTypeMap mimeTypeMap = new MimetypesFileTypeMap();
HttpHeaders headers = new HttpHeaders();
try {
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", "attachment; filename=" + new String(file.getName().getBytes("UTF-8"), "iso8859-1"));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.add("Last-Modified", new Date().toString());
headers.add("ETag", String.valueOf(System.currentTimeMillis()));
headers.add("Content-Type",mimeTypeMap.getContentType(file));
}catch (Exception e){
e.printStackTrace();
}
return ResponseEntity
.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/x-msdownload"))
.body(new FileSystemResource(file));
}
ブラウズ
@GetMapping(value="/preview/{id:\\w+}.file")
public ResponseEntity preview(@PathVariable(name="id") String id){
ResultMsg<?> resultMsg = uFileService.download(ExplorerConstants.ANONYMOUS,id);
File file = (File) resultMsg.getData();
MimetypesFileTypeMap mimeTypeMap = new MimetypesFileTypeMap();
HttpHeaders headers = new HttpHeaders();
try {
//预览一定要设置Content-Type,否则打不开
headers.add("Content-Type",mimeTypeMap.getContentType(file));
}catch (Exception e){
e.printStackTrace();
}
return ResponseEntity
.ok()
.headers(headers)
.body(new FileSystemResource(file));
}
追記
このセクションでネットワークディスクコードのフルバージョンをダウンロードします:https:
//github.com/harrypottry/test-mongo-explorer
もちろん、このコードは単なるデモであり、多くの機能は完璧ではなく、後でそれを維持する機会があります〜
アーキテクチャに関する知識の詳細については、この一連のJava記事、アドレスナビゲーションに注意してください:Javaアーキテクトの成長パス