リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

最近、画像、ビデオ、CSS/JS などの静的リソースを配置するために nginx を使用する方法を学習しています。以下に学習のヒントをいくつか記録しておきます。

1. nginxのインストールと設定

エディターが使用するサーバーは Alibaba Cloud の軽量アプリケーションサーバーであり、システムは Ubuntu を使用しています。 TCP ポート 9090 を必ず開いてください。ポート 9090 をサーバー ポートとして使用しない場合は、開く必要はありません。

インストール

まず、インストールパッケージを入手する必要があります。こちらはnginx-1.11.3-ubuntu.tar.gzです。https://pan.baidu.com/s/1vvb41QkOJ4VqfyFckXBkjA (パスワード45wz)

エディターはインストールパッケージを/usr/nginxに置き、ディレクトリに入り、 tar -zxvf nginx-1.11.3.tar.gzを実行して解凍します。

構成

/usr/nginx/conf/nginx.conf を変更します。

サーバー{
 9090を聴く;
 server_name ローカルホスト;

 location ~ .(jpg|png|jpeg|gif|bmp)$ { #認識可能なファイルサフィックス root /usr/nginx/image/; #イメージマッピングパス autoindex on; #自動インデックスを有効にする expires 1h; #有効期限}
 場所 ~ .(css|js)$ {
  ルート /usr/nginx/static/;
  自動インデックスオン;
  1時間で期限切れになります。
 } 
 場所 ~ .(AVI|mov|rmvb|rm|FLV|mp4|3GP)$ {
  ルート /usr/nginx/video/;
  自動インデックスオン;
  1時間で期限切れになります。
 }

変更が必要なものは変更し、追加が必要なものは追加し、無作為に削除しないように注意してください

最後のステップは、nginxを起動して./usr/nginx/sbin/nginxを実行することです。

この時点で、nginxサーバーは準備完了です

イメージ 01.jpg を /usr/nginx/image に配置し、ローカルで http://ip:9090/01.jpg にアクセスして、イメージにアクセスできるかどうかを確認できます。

2. SpringBootはリソースのアップロードを実装する

ドキュメント:

<親>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <バージョン>2.1.7.RELEASE</バージョン>
</親>
<依存関係>
 <依存関係>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <バージョン>2.1.7.RELEASE</バージョン>
 </依存関係>
 <依存関係>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <バージョン>2.1.7.RELEASE</バージョン>
  <scope>テスト</scope>
 </依存関係>
 <!-- Apache ツールキット -->
 <依存関係>
  <グループ ID>org.apache.commons</グループ ID>
  <artifactId>コモンズ-lang3</artifactId>
  <バージョン>3.8.1</バージョン>
 </依存関係>
 <依存関係>
  <グループ ID>org.apache.commons</グループ ID>
  <artifactId>コモンズ io</artifactId>
  <バージョン>1.3.2</バージョン>
 </依存関係>
 <依存関係>
  <groupId>コモンズネット</groupId>
  <artifactId>コモンズネット</artifactId>
  <バージョン>3.6</バージョン>
 </依存関係>
 <!-- ファイルアップロードコンポーネント-->
 <依存関係>
  <groupId>コモンズファイルアップロード</groupId>
  <artifactId>コモンズファイルアップロード</artifactId>
  <バージョン>1.3.3</バージョン>
 </依存関係>
 <依存関係>
  <groupId>org.projectlombok</groupId>
  <artifactId>ロンボク</artifactId>
  <バージョン>1.16.22</バージョン>
 </依存関係>
 <依存関係>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <バージョン>0.1.54</バージョン>
 </依存関係>
 <依存関係>
  <groupId>ジョダタイム</groupId>
  <artifactId>joda-time</artifactId>
  <バージョン>2.10.3</バージョン>
 </依存関係>
</依存関係>

アプリケーション.yml:

ftp:
 ホスト: あなた自身のサーバーのIP
 ユーザー名: サーバーアカウント パスワード: サーバーパスワード ポート: 22
 ルートパス: /usr/nginx/image
 画像:
 url: http://ip:9090/ # ftp.img.url は省略できます。ファイルが正常にアップロードされた後にファイル パスを返すためにのみ使用されます。

ツールクラス FtpUtil.class:

com.jcraft.jsch.* をインポートします。
org.slf4j.Logger をインポートします。
org.slf4j.LoggerFactory をインポートします。
org.springframework.beans.factory.annotation.Value をインポートします。
org.springframework.stereotype.Component をインポートします。
java.io.InputStream をインポートします。
java.util.Properties をインポートします。
@成分
パブリッククラス FtpUtil {
 プライベート静的 Logger ロガー = LoggerFactory.getLogger(FtpUtil.class);
 /**
  * FTPサーバーのIPアドレス */
 プライベート静的文字列ホスト;
 @Value("${ftp.host}")
 パブリックvoid setHost(String val){
  FtpUtil.host = val;
 }
 /**
  * ポート */
 プライベート静的 int ポート;
 @Value("${ftp.port}")
 パブリックvoid setPort(int val){
  FtpUtil.port = val;
 }
 /**
  * ユーザー名*/
 プライベート静的文字列ユーザー名;
 @Value("${ftp.userName}")
 パブリックvoid setUserName(String val){
  FtpUtil.userName = val;
 }
 /**
  * パスワード*/
 プライベート静的文字列パスワード;
 @Value("${ftp.password}")
 パブリックvoid setPassword(String val){
  FtpUtil.password = val;
 }
 /**
  * 画像が保存されるルートディレクトリ */
 プライベート静的文字列 rootPath;
 @Value("${ftp.rootPath}")
 パブリックvoid setRootPath(String val){
  FtpUtil.rootPath = val;
 }
 /**
  * 画像を保存するパス */
 プライベート静的文字列 imgUrl;
 @Value("${ftp.img.url}")
 パブリックvoid setImgUrl(String val){
  FtpUtil.imgUrl = val;
 }
 /**
  * 接続を取得 */
 プライベート静的ChannelSftp getChannel()は例外をスローします{
  JSch jsch = 新しい JSch();
  //->ssh ルート@ホスト:ポート
  セッション sshSession = jsch.getSession(userName,host,port);
  //パスワード sshSession.setPassword(password);
  プロパティ sshConfig = new Properties();
  sshConfig.put("StrictHostKeyChecking", "no");
  sshSession.setConfig(sshConfig);
  sshSession.connect();
  チャネル channel = sshSession.openChannel("sftp");
  チャネルを接続します。
  (ChannelSftp) チャネルを返します。
 }
 /**
  * FTP アップロード画像 * @param inputStream 画像 io ストリーム * @param imagePath パス、存在しない場合はディレクトリを作成 * @param imagesName 画像名 * @return urlStr 画像保存パス */
 パブリック静的文字列 putImages(InputStream inputStream、文字列 imagePath、文字列 imagesName){
  試す {
   チャネルSftp sftp = getChannel();
   文字列パス = rootPath + imagePath + "/";
   createDir(パス、sftp);
   // ファイルをアップロード sftp.put(inputStream, path + imagesName);
   logger.info("アップロードに成功しました!");
   sftp.quit();
   sftp を終了します。
   //返されたパスを処理する String resultFile;
   結果ファイル = imgUrl + 画像パス + 画像名;
   結果ファイルを返します。
  } キャッチ (例外 e) {
   logger.error("アップロードに失敗しました: " + e.getMessage());
  }
  戻る "";
 }
 /**
  * ディレクトリを作成する */
 プライベート静的void createDir(String path,ChannelSftp sftp)はSftpExceptionをスローします{
  文字列[] フォルダー = path.split("/");
  sftp.cd("/");
  for ( 文字列 フォルダ : フォルダ ) {
   フォルダの長さ() > 0 の場合
    試す {
     sftp.cd( フォルダー );
    }catch (SftpException e) {
     sftp.mkdir( フォルダー );
     sftp.cd( フォルダー );
    }
   }
  }
 }
 /**
  * 画像を削除 */
 パブリック静的 void delImages(String imagesName){
  試す {
   チャネルSftp sftp = getChannel();
   文字列パス = rootPath + imagesName;
   sftp.rm(パス);
   sftp.quit();
   sftp を終了します。
  } キャッチ (例外 e) {
   e.printStackTrace();
  }
 }
}

ツールクラス IDUtils.class (アップロードされた画像名を変更します):

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 を返します。
 }
}

NginxService.クラス:

com.wzy.util.FtpUtil をインポートします。
com.wzy.util.IDUtils をインポートします。
lombok.extern.slf4j.Slf4j をインポートします。
org.joda.time.DateTime をインポートします。
org.springframework.stereotype.Service をインポートします。
org.springframework.web.multipart.MultipartFile をインポートします。
java.io.IOException をインポートします。
java.io.InputStream をインポートします。
/**
 * @パッケージ: com.wzy.service
 * @著者: Clarence1
 * @日付: 2019/10/4 21:34
 */
@サービス
翻訳者
パブリッククラスNginxService {
 パブリックオブジェクトアップロードピクチャ(マルチパートファイルアップロードファイル) {
  //1. アップロードされた画像の新しいファイル名を生成します //1.1 元のファイル名を取得します String oldName = uploadFile.getOriginalFilename();
  //1.2 IDUtils ツール クラスを使用して新しいファイル名を生成します。新しいファイル名 = newName + ファイル サフィックス String newName = IDUtils.genImageName();
  oldName != null であると主張します。
  新しい名前 = 新しい名前 + 古い名前.substring(古い名前.lastIndexOf("."));
  //1.3 サーバー上にファイルを保存するためのサブディレクトリを生成します。String filePath = new DateTime().toString("/yyyyMMdd/");
  //2. イメージをイメージサーバーにアップロードします //2.1 アップロードされた io ストリームを取得します InputStream input = null;
  試す {
   入力 = uploadFile.getInputStream();
  } キャッチ (IOException e) {
   e.printStackTrace();
  }
  //2.2 アップロードするには FtpUtil ツール クラスを呼び出します。 return FtpUtil.putImages(input, filePath, newName);
 }
}

NginxController.クラス:

com.fasterxml.jackson.core.JsonProcessingException をインポートします。
com.fasterxml.jackson.databind.ObjectMapper をインポートします。
com.wzy.service.NginxService をインポートします。
lombok.extern.slf4j.Slf4j をインポートします。
org.springframework.beans.factory.annotation.Autowired をインポートします。
org.springframework.web.bind.annotation.PostMapping をインポートします。
org.springframework.web.bind.annotation.RequestParam をインポートします。
org.springframework.web.bind.annotation.RestController をインポートします。
org.springframework.web.multipart.MultipartFile をインポートします。
java.util.HashMap をインポートします。
java.util.Map をインポートします。
@レストコントローラ
翻訳者
パブリッククラスNginxController {
 オートワイヤード
 プライベート NginxService nginxService;
 /**
  * 写真や動画をアップロードできます。nginx 設定で認識可能なサフィックスを設定するだけです*/
 @PostMapping("/アップロード")
 パブリック文字列 pictureUpload(@RequestParam(値 = "file") MultipartFile uploadFile) {
  長いbegin = System.currentTimeMillis();
  文字列 json = "";
  試す {
   オブジェクト結果 = nginxService.uploadPicture(uploadFile);
   json = 新しい ObjectMapper().writeValueAsString(結果);
  } キャッチ (JsonProcessingException e) {
   e.printStackTrace();
  }
  長い終了 = System.currentTimeMillis();
  log.info("タスクが完了しました。消費された合計時間: [" + (end-begin) + "] ミリ秒");
  json を返します。
 }
 @PostMapping("/アップロード")
 パブリックオブジェクト picturesUpload(@RequestParam(値 = "file") MultipartFile[] uploadFile) {
  長いbegin = System.currentTimeMillis();
  マップ<Object, Object> map = new HashMap<>(10);
  整数カウント = 0;
  for (MultipartFile ファイル: uploadFile) {
   オブジェクト結果 = nginxService.uploadPicture(file);
   map.put(count, 結果);
   カウント++;
  }
  長い終了 = System.currentTimeMillis();
  log.info("タスクが完了しました。消費された合計時間: [" + (end-begin) + "] ミリ秒");
  マップを返します。
 }
}

プロジェクトを開始する、Postmanアーティファクト

知らせ:

1. ビデオと写真を一緒にアップロードする場合は、nginx.conf 構成ファイルを変更し、対応するビデオ サフィックスを追加するだけです。コードは変更されず、アップロード後に /usr/image にも配置されます。そうしないと、ファイルはアップロードできますが、アクセスできません。

2. 上記のコードのアップロードインターフェースは複数のファイルをアップロードするために使用されます

ソースコードのダウンロード

要約する

上記は、編集者が紹介した SpringBoot+nginx リソースアップロード機能です。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Kubernetes を使用して Springboot または Nginx をデプロイするための詳細なチュートリアル
  • サーバー上で Nginx を使用して Springboot プロジェクトをデプロイする方法の詳細なチュートリアル (jar パッケージ)
  • Nginx リバース プロキシ springboot jar パッケージ プロセス分析
  • Springsession nginx リバースプロキシ統合プロセス
  • Springboot+nginx+https+linux で負荷分散とドメイン名アクセスの簡単なテストを実現
  • SpringBootはFastDFS+Nginxを統合し、トークンベースのアンチホットリンク方式を統合します
  • dockercompose を使用して springboot-mysql-nginx アプリケーションをビルドする
  • Spring Boot WebSocket 統合と nginx 構成の詳細な説明
  • Springmvc nginxで動的と静的の分離を実現するプロセスの詳細な説明

<<:  ReactでuseStateを使用する詳細な例

>>:  Mysql論理アーキテクチャの詳細な説明

推薦する

JavaScript で虫眼鏡の特殊効果を実現

達成される効果:マウスを小さな画像の上に置くと、小さなブロックが小さな画像の上に表示され、この小さな...

React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド

目次事業背景テクノロジーの活用技術的な問題デザインのアイデア😱 困惑と苦痛に満ちた顔🙄考え始める🌲デ...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

WeChatアプレットがテキストスクロールを実装

この記事の例では、WeChatアプレットでテキストスクロールを実装するための具体的なコードを参考まで...

Nodeはバックエンドの実装手順を素早く構築します

1. まず、node、express、express-generator をインストールします (4...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

nodejsとyarnをインストールし、Taobaoソースプロセスレコードを構成する

目次1. nodejsをダウンロードする2. ダブルクリックしてインストール3. グローバル npm...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...

IDEA は MySQL への接続時にエラーを報告します。サーバーが無効なタイムゾーンを返します。タブに移動して serverTimezone プロパティを設定してください。

これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...

MySQL 4.1/5.0/5.1/5.5/5.6の主な違い

バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...

Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...

JavaScript での HTML キャンバスとページ ストレージ テクノロジの使用に関する詳細な説明

目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...

K8Sの高度な機能を理解するための記事

目次K8Sの高度な機能高度な機能要約するkubectl サービスの問題のトラブルシューティングK8S...

CSS3はマスク連打機能を実現する

最近Bステーションでスマートアンチブロッキング弾幕と呼ばれる弾幕エフェクトを見ました。これは伝説のマ...