最近、画像、ビデオ、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に置き、ディレクトリに入り、 構成 /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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
達成される効果:マウスを小さな画像の上に置くと、小さなブロックが小さな画像の上に表示され、この小さな...
目次事業背景テクノロジーの活用技術的な問題デザインのアイデア😱 困惑と苦痛に満ちた顔🙄考え始める🌲デ...
http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...
この記事の例では、WeChatアプレットでテキストスクロールを実装するための具体的なコードを参考まで...
1. まず、node、express、express-generator をインストールします (4...
React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...
目次1. nodejsをダウンロードする2. ダブルクリックしてインストール3. グローバル npm...
フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...
これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...
バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...
設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...
目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...
目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...
目次K8Sの高度な機能高度な機能要約するkubectl サービスの問題のトラブルシューティングK8S...
最近Bステーションでスマートアンチブロッキング弾幕と呼ばれる弾幕エフェクトを見ました。これは伝説のマ...