分散トピック-分散キャッシュテクノロジーのMongoDB04-MongoDBに基づくネットワーククラウドディスクの実現

序文

前の章では、分散キャッシングテクノロジーに関して、「Redis分散キャッシングテクノロジーの使用と原則」を分析しましたこのセクションでは、引き続きMongoDBについて説明します。

MongoDBについては、合計5つのセクションがあります。

基本的な実現アイデアの紹介

一般的なネットワークディスクは、Baiduネットワークディスク、Tencentマイクロディスク、360ネットワークディスク、Ali OSS、Qiniu Cloud ...

このセクションの内容は、MongoDBを介して特定のディスクのファイルをアップロードおよびダウンロードする基本的な機能を実現することです〜

陰謀

  1. なぜMongoDBを使用してクラウドディスクを実装するのですか?
    GridFSはJavaでキャッシュミドルウェアとして使用され、クラウドディスクシナリオに適した構造化された非リレーショナルデータベースです。

  2. なぜクラウドディスクが存在するのですか?
    私自身のプロジェクトは、変換後
    、フロントエンドにネイティブのBootstrap + layui、バックエンドにSpringBoot、データベースにMongoDBを使用して、完全にサーブレット解除フレームワーク(SpringBoot)が実装されます。

  3. 個人的な経験の
    共有自分の経験を共有することは、会社のすべてのプロジェクトで使用されるファイルストレージの依存関係に相当します

技術的な準備: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つのタイプがあります

  1. ディスクに直接書き込み、nginxを介してアクセスします。明らかに、パフォーマンスが低下します
  2. FastDFS推奨ソリューションなどの分散ファイルシステムは、最高のパフォーマンスを発揮し、拡張が容易で、拡張が困難です。
  3. 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アーキテクト成長パス

おすすめ

転載: blog.csdn.net/qq_34361283/article/details/105906544