Linux クラウド サーバー上に SFTP サーバーとイメージ サーバーを構築する方法

Linux クラウド サーバー上に SFTP サーバーとイメージ サーバーを構築する方法

まず、SFTP プロトコルと FTP プロトコルの違いを理解してください。ここでは詳細には触れません。

Sftp のデフォルトのリスニング ポートは 22 です。FTP のデフォルトのリスニング ポートは 21 です。これら 2 つのポートの間には本質的な違いはありません。どちらもファイル転送プロトコルに基づいています。前者は安全性能が高く、後者は効率性が高いです。

では本題に入りましょう:

まず、Linux アカウントが接続できることを確認します。sftp のデフォルトのパスワードは、Linux ルート アカウントのパスワードです。

これは管理者アカウントのユーザー名とパスワードです。通常、このパスワードを変更せずにそのまま Sftp に接続できます。 Xftpを見てみましょう

接続が成功すれば問題がないことを示します。

次に、Alibaba Cloudサーバーの場合は、他の問題を回避するために、ファイアウォールとセキュリティグループの両方を必ず開いてください。

ファイアウォールもある

3番目、非常に重要なステップ、Java JSCHを介してアップロードする

ここのブロガーは Maven プロジェクトであり、パッケージを直接送信します (Web プロジェクトの場合は、公式 Web サイトにアクセスして jar パッケージをダウンロードしてください)

<依存関係>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <バージョン>0.1.49</バージョン>
</依存関係>

4. 構成パッケージをダウンロードしたら、ツール クラスを使用して接続をアップロードします。 (ここで設定ファイルに注釈を付けて自分で設定することもできます)

パブリッククラスSFTPInfo{
    public static final String SFTP_REQ_HOST = "000.00.00.00"; //クラウドサーバーのIP
    public static final String SFTP_REQ_USERNAME = "00t"; // ユーザー名 public static final String SFTP_REQ_PASSWORD = "00"; // パスワード public static final int SFTP_DEFAULT_PORT = 22; // ポート public static String basePath="/usr/games/images"; // サーバー上でファイルが保存されるメイン ディレクトリ (これはファイルのアップロード パスです)
    public static String baseUrl="https://##.##.com/images"; //オンラインドメイン名アクセスは nginx アクセス パスを指定します (ここではパスが重要です)
}

ここでのユーザー名とパスワードは、あなた自身のサーバーユーザー名とパスワードです。

5. SFTPアップロードツール:

java.io.InputStream をインポートします。
java.util.Properties をインポートします。
org.slf4j.Logger をインポートします。
org.slf4j.LoggerFactory をインポートします。
com.jcraft.jsch.Channel をインポートします。
com.jcraft.jsch.ChannelSftp をインポートします。
com.jcraft.jsch.JSch をインポートします。
com.jcraft.jsch.JSchException をインポートします。
com.jcraft.jsch.Session をインポートします。
com.jcraft.jsch.SftpException をインポートします。 
パブリッククラスSftpUtils {
    プライベート静的最終ロガー LOG = LoggerFactory.getLogger(SftpUtils.class);
 
    /**
     * 参考例 *
     * @param 引数
     */
    パブリックチャネル getChannel(セッション セッション) {
        チャネル channel = null;
        試す {
            チャネル = session.openChannel("sftp");
            チャネルを接続します。
            LOG.info("チャネルの取得に成功しました!");
        } キャッチ (JSchException e) {
            LOG.info("チャネルの取得に失敗しました!", e);
        }
        戻りチャネル。
    }
 
    パブリックセッションgetSession(Stringホスト、intポート、Stringユーザー名、
                              最終的な文字列パスワード){
        セッションセッション = null;
        試す {
            JSch jsch = 新しい JSch();
            jsch.getSession(ユーザー名、ホスト、ポート);
            セッション = jsch.getSession(ユーザー名、ホスト、ポート);
            セッション.setPassword(パスワード);
            プロパティ sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            セッションの設定を setConfig(sshConfig);
            セッションに接続します。
            LOG.info("セッションが接続されました!");
        } キャッチ (JSchException e) {
            LOG.info("チャネルの取得に失敗しました!", e);
        }
        セッションを返す。
    }
 
    /**
     * フォルダを作成 *
     * @param sftp
     * @param ディレクトリ
     * フォルダ名 */
    パブリック void mkdir(ChannelSftp sftp、String dir) {
        試す {
            sftp.mkdir(ディレクトリ);
            System.out.println("フォルダーが正常に作成されました!");
        } キャッチ (SftpException e) {
            System.out.println("フォルダーの作成に失敗しました!");
            e.printStackTrace();
        }
    }
 
    /**
     * @param sftp
     * @param ディレクトリ
     * アップロードディレクトリ * @param ファイル
     * ファイルをアップロード * @return
     */
    パブリックブール型アップロードファイル(ChannelSftp sftp、文字列 dir、入力ストリーム ファイル、文字列 ファイル名) {
        ブールフラグ = false;
        試す {
            sftp.cd(ディレクトリ);
            if (ファイル != null) {
                sftp.put(ファイル、ファイル名);
                フラグ=true;
                フラグを返します。
            } それ以外 {
                フラグ=false;
                フラグを返します。
            }
        } キャッチ (例外 e) {
 
            フラグ=false;
            フラグを返します。
        }
    }
 
    /**
     * ファイルをダウンロード *
     * @param ディレクトリ
     * ダウンロードディレクトリ * @param downloadFile
     * ダウンロードしたファイル * @param saveFile
     * ローカルパス * @param sftp
     */
    パブリック文字列ダウンロード(文字列ディレクトリ、文字列ダウンロードファイル、
                           文字列 saveFile、ChannelSftp sftp) {
        文字列結果 = "";
        試す {
            sftp.cd(ディレクトリ);
            sftp.get(ダウンロードファイル、保存ファイル);
            result = "ダウンロードに成功しました!";
        } キャッチ (例外 e) {
            result = "ダウンロードに失敗しました!";
            LOG.info("ダウンロードに失敗しました!", e);
            ;
        }
        結果を返します。
    }
 
    /**
     * ファイルを削除*
     * @param ディレクトリ
     * ファイルが保存されているディレクトリを削除するには* @param deleteFile
     * 削除するファイル * @param sftp
     */
    パブリック String delete(String directory, String deleteFile, ChannelSftp sftp) {
        文字列結果 = "";
        試す {
            sftp.cd(ディレクトリ);
            sftp.rm(ファイルを削除します);
            result = "正常に削除されました!";
        } キャッチ (例外 e) {
            result = "削除に失敗しました!";
            LOG.info("削除に失敗しました!", e);
        }
        結果を返します。
    }
 
    プライベート void closeChannel(チャンネル チャンネル) {
        チャネルが null の場合
            チャネルが接続されている場合
                チャネルを切断します。
            }
        }
    }
 
    プライベートvoid closeSession(セッションセッション) {
        セッションが null の場合
            セッションが接続されている場合
                セッションを切断します。
            }
        }
    }
 
    パブリック void closeAll(ChannelSftp sftp、チャネル チャネル、セッション セッション) {
        試す {
            チャネルを閉じます(sftp);
            チャネルを閉じます。
            セッションをクローズします。
        } キャッチ (例外 e) {
            LOG.info("closeAll", e);
        }
    }
}

ツール クラスを変更する必要はなく、直接使用できます。

ファイル名をランダムに生成するツールクラスもあり、これも全員に送信されます。

java.util.Random をインポートします。 
パブリッククラスIDUtils {
 
    /**
     * ランダムな画像名を生成します */
    パブリック静的文字列genImageName() {
        // ミリ秒を含む現在の時刻の長整数値を取得します。long millis = System.currentTimeMillis();       
        // 3 つの乱数を追加します。Random random = new Random();
        ランダムなnextInt(999)
        //3桁未満の場合は先頭に0を追加します
        文字列 str = millis + String.format("%03d", end3);        
        str を返します。
    }
}

6. バックグラウンドリクエスト方式

ブロガーはここでクリップボードを使用してアップロードしました。パラメータはシリアル化をサポートしていないため、1つずつ受け入れられます。 @RequestParam("file") MultipartFileファイルがたくさんあります。他のパラメータと投稿リクエストメソッドを追加すると、投稿リクエストメソッドが見つからないというエラーが発生します。この問題は影響しません。

@Log("ウェブサイトケースアップロード情報")
@レスポンス本文
@PostMapping("/アップロード")
@RequiresPermissions("common:cases:upload")
R アップロード(@RequestParam("file") MultipartFile ファイル、@RequestParam("ctitle") 文字列 ctitle、@RequestParam("cmessage") 文字列 cmessage、
       @RequestParam("casetroduction") 文字列 casetroduction、@RequestParam("strdate") 日付 strdate、@RequestParam("stpdate") 日付 stpdate、
       @RequestParam("credate") Date credate、HttpServletRequest request) は ParseException、IOException をスローします {
   文字列 oldName = file.getOriginalFilename();
   //IDUtils ツール クラスを使用して新しいファイル名を生成します。新しいファイル名 = newName + ファイル サフィックス String newName = IDUtils.genImageName();
   新しい名前 = 新しい名前 + 古い名前.substring(古い名前.lastIndexOf("."));
   SftpUtils ft = 新しい SftpUtils();
   //SFtoInfo パラメータを介してパラメータを接続します Session s = ft.getSession(SFTPInfo.SFTP_REQ_HOST,SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME,SFTPInfo.SFTP_REQ_PASSWORD);
   チャネル channel = ft.getChannel(s);
   チャネルSftp sftp = (チャネルSftp)channel;
   ブール値のアップロード = ft.uploadFile(sftp,SFTPInfo.basePath, file.getInputStream(),newName);
   if(アップロード){
      //アップロードを正常に終了します ft.closeAll(sftp, channel, s); //接続を閉じます CasesDO cases=new CasesDO();
      case.setCtitle(ctitle);
        // これは非常に重要です。これは、データベースに書き込まれたアクセス パスと、画像にアクセスするためのオンライン ドメイン名です。ブロガーはここに SSL 証明書を追加しました。// https://**.**.com/images newName=ファイル名画像 cases.setCaseimg(SFTPInfo.baseUrl + "/" + newName);
      case.setCasetroduction(casetroduction);
      ケース.setStpdate(stpdate);
      ケース.setCredate(credate);
      strdate をセットします。
      case.setCmessage(cmessage);
      casesService.save(cases) > 0 の場合 {
         return R.ok("アップロード成功");
      }
               }それ以外 {
      R.error("アップロードエラー"); を返します。
   }
   R.error() を返します。
}

フロントエンドのjsを見てください------リクエストパラメータはHashMapに置き換えることができますが、バックエンドはObjectを使用して他の型に2回変換します。

var クリップボード = 新しいクリップボード('button.copy', {
    テキスト: 関数 (トリガー) {
        layer.msg('ファイルパスがクリップボードにコピーされました');
        $(trigger).attr('url') を返します。
    }
});
layui.use('アップロード', 関数() {
    var アップロード = layui.upload;
    //サンプルを実行する upload.render({
        elem: '#test1', //バインディング要素 url: '/common/cases/upload', //アップロードインターフェースサイズ: 100000,
        // 自動: false、
        受け入れる: 'ファイル'、
        //bindAction: '#submits',
        前: 関数 (obj) {
            //obj パラメータに含まれる情報は、choose コールバックとまったく同じです。入力パラメータlayer.load()はバックグラウンドに送信されます。
            this.data = {
                ctitle: $('#ctitle').val(),
                cmessage: $('#cmessage').val() 、
                ケース紹介: $('#casetroduction').val()
                ,strdate: $('#strdate').val()
                ,stpdate: $('#stpdate').val()
                ,credate: $('#credate').val(),
            };
        },
        完了: 関数 (r) {
            親レイヤーのメッセージ(r.msg);
            親.reLoad();
            var index = parent.layer.getFrameIndex(window.name); // ウィンドウのインデックスを取得します。parent.layer.close(index);
        },
        エラー: 関数 (r) {
            レイヤー.msg(r.msg);
        }
    });
});

成功したらデータベースに保存します-------

7. ページを表示しません

アップロードが成功すると、画像はサーバー パス アドレスである SftpInfo クラスの /usr/games/images パスに保存されます。

アップロードが成功すると、このパスに保存されます。ルートユーザーでない場合は、chmod 777 /usr/gemes/ の権限を与える必要があります。

8. 以下は nginx の設定です (ここでは nginx のインストール方法は説明しません。Baidu で検索してください)

ここで最も重要なステップは、このnginxパスを介してアップロードされた画像のパスを指定することです。autoIndex on;はブラウジングをオンにし、aliasは直接指定します。

nginxを起動して設定を更新する

/usr/local/nginx/sbin/nginx -s リロード

9. 写真をご覧になれば完了です。

ブロガーは写真を再アップロードした

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux で FTP サーバーを設定するためのチュートリアル
  • Linux で FTP イメージ サーバーをインストールして展開する方法
  • Linux (CentOS) での SFTP サーバーの設定
  • Linux環境でFTPサーバーを素早く構築する方法の紹介

<<:  HTML におけるブロックコメントの使用に関する詳細な紹介

>>:  要素に丸い境界線を追加する border-radius メソッド

推薦する

mysql データベースの作成、ユーザーの追加、ユーザー認証の実用的な方法

1. MySQLデータベースを作成する1. データベース構文を作成する --「testdb」という名...

CSS 8 目を引く HOVER 効果のサンプル コード

1. エフェクトHTMLを送信する <div id="送信ボタン">...

MySQLパスワード変更例の詳細な説明

MySQLパスワード変更例の詳細な説明長い間 MySQL を使用していませんでした。今日、MySQL...

React Native環境のインストールプロセス

react-native インストールプロセス1.npx react-native init Awe...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...

Linux ディスクのマウント、パーティション分割、容量拡張操作を実装する方法

基本概念操作の前に、まずいくつかの基本的な概念を理解する必要がありますディスクLinux システムで...

IdeaでTomcatを起動したときに複数のリスナーが報告される問題を解決する

エラーのスクリーンショット例外が発生した場所が見つかりません。解決策: リソースディレクトリにlog...

CSS3で背景画像にカラーマスクを追加する方法

以前、開発中に背景レイヤーにカラーマスクを追加する必要のあるプロジェクトに遭遇しました。ここでは、背...

JavaScript による省・市連携効果の実現

この記事では、省と都市間の連携効果を実現するためのJavaScriptの具体的なコードを参考までに共...

Vueリスナーの使用例の詳細な説明

1つ目はjQueryのajaxを使用してリクエストを送信することです ユーザーが登録するときに、リス...

MySQL のデータベース パフォーマンスに影響を与える要因の説明

データベースのパフォーマンスに関する話面接では、「データベースにどのくらい精通していますか?」など、...

Nginx がサーバーの生存状態をパッシブにチェックする詳細な説明

導入定期的にヘルスチェックを送信して、アップストリーム グループ内の HTTP サーバーのヘルスを監...

CSS スキル コレクション - 古典の中の古典

リンク上の点線のボックスを削除しますコードをコピーコードは次のとおりです。 a:アクティブ、a:フォ...

ウェブサイトの速度を上げる6つの方法

1. .js ライブラリ ファイルのアドレスを Google CDN アドレスに置き換えます。 (G...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...