まず、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を起動して設定を更新する
9. 写真をご覧になれば完了です。ブロガーは写真を再アップロードした 上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: HTML におけるブロックコメントの使用に関する詳細な紹介
>>: 要素に丸い境界線を追加する border-radius メソッド
更新: 最近、サーバーがマイニング ウイルスによってハッキングされたことが判明しました。これは、おそ...
span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...
序文: ietester でドキュメント コードを表示するには、debugbar を使用します。すべ...
目次1. はじめに2. 行き詰まった問題の分析3. 解決策(理論) 4. ソリューション(コード) ...
Docker を起動したら、利用できるオプションを見てみましょう。 公式のものがある場合は、もちろ...
目次1 マウントディレクトリとファイルを作成する2 Redisイメージを取得する3 コンテナを作成し...
Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パ...
ハードウェア上の理由により、機械は標準時間にある程度追いつけない場合があり、その誤差は 1 か月で数...
あなたがlinuxerだと仮定すると、 windowserだとは想定しません。Windows ユーザ...
VMWare (Virtual Machine ware) は、「仮想 PC」ソフトウェア会社です。...
マスターするには: localStorage、コンポーネントのカプセル化えーと、GIF に変換したビ...
「これは革命になるだろう」という記事が出たあと。業界の皆様に認知され、もちろん内外からの評価もいただ...
クエリキャッシュ制限query_cache_limit は、単一のクエリで使用できるバッファ サイズ...
Mixin は、再利用可能な機能を Vue コンポーネント間で分散する非常に柔軟な方法を提供します。...
目次継承とプロトタイプチェーン継承されたプロパティ継承されたメソッドJavaScript でのプロト...