リソースアップロード機能を実現するための 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 コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

JS で Websocket ベースのマルチターミナル ブリッジング プラットフォームを実装する方法

目次1. デバッグ対象2. WebSocketの機能3. ソケット接続を確立する3.1 部屋の作成方...

Nginx は https ウェブサイト構成コード例を実装します

https ベースポート 443。これはキーと呼ばれるものに使用されます。これらのことを理解せずにで...

Node.js における非同期プログラミングの知識ポイントの詳細な説明

導入JavaScript はデフォルトでシングルスレッドであるため、コードは並列実行するための新しい...

VMware15 の CentOS7 インストールの詳細なプロセスとよくある問題 (画像とテキスト)

1. インストールパッケージの準備VMware-player-15.0.4-12990004、非商...

HTML で JavaScript を使用する

<script> タグHTML5では、スクリプトには次の属性があります: async、d...

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

Ubuntu 18.04にmysql5.7をインストールする

Ubuntu 18.04では参考までにmysql 5.7をインストールします。具体的な内容は以下のと...

MySQL における悲観的ロックと楽観的ロック

リレーショナル データベースでは、悲観的ロックと楽観的ロックがリソース同時実行シナリオのソリューショ...

MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)

問題の説明 (環境: windows7、MySql8.0)今日、MySql をインストールした後、M...

JavaScript ではおそらく switch 文を使う必要はない

目次スイッチも複雑なコードブロックもありませんPythonからのインスピレーション辞書を使用してスイ...

React Nativeはモニタリングジェスチャーの上下プル効果を実現します

React Native は、プルアップとプルダウンの監視ジェスチャを実装します。詳細なコアコードは...

MySQL の 10 進数データ型の小数点埋め込み問題の詳細な説明

序文開発プロセスでは、10 進データ型がよく使用されます。 MySQL では、小数点は正確なデータ型...

Linux nohup コマンドの原理と例の分析

nohup コマンドUnix/Linux を使用する場合、通常はプログラムをバックグラウンドで実行す...