SpringBoot の場合 - ファイルのアップロード

目次

導入

ファイルアップロードフロントエンドページの 3 つの要素

 サーバーがファイルを受信します

まとめ

ローカルストレージ

成し遂げる

コードの最適化

まとめ 

アリババクラウドOSS

アリ・クラウド

アリババクラウドOSS

サードパーティのサービスの使用 -- 一般的な考え方

 準備

公式SDKコードを参照してエントリープログラムを記述します。

統合利用

Alibaba Cloud OSS の使用手順

Alibaba Cloud OSS の使用手順

SDKに従ってエントリープログラムを書く

事例統合OSS(ファイルアップロードインターフェースの実装)

 Alibaba Cloud OSS ツールの紹介

コントロールクラス

テスト 

フロントエンドとバックエンドの共同デバッグ 

まとめ

ファイルアップロードの概要

フロントエンドページの3要素(ファイルフォームアイテム、ポストメソッド、マルチパート/フォームデータ)

ファイルを受信するサーバー インターフェイス (マルチパート)

ファイルの保存方法


導入

  • ファイルのアップロードとは、他のユーザーが閲覧またはダウンロードできるように、ローカルの写真、ビデオ、オーディオ、その他のファイルをサーバーにアップロードするプロセスを指します。
  • ファイルアップロードはプロジェクトで広く使われており、WeiboやMomentsへの投稿にもファイルアップロード機能をよく使います。

ファイルアップロードフロントエンドページの 3 つの要素

フォームアイテムファイル

フォーム送信方法

フォームのエンコード形式

上記のページを実行した結果は次のようになります。

 サーバーがファイルを受信します

コントロールクラスのコードは次のとおりです。

package com.example.tlias.controller;

import com.example.tlias.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@Slf4j

public class UpLoadController {
    @PostMapping("upload")
    public Result upload(String username, Integer age, MultipartFile image) {
        log.info("文件上传,name:{},age:{},image:{}", username, age, image);
        return Result.success();
    }

}

 SpringBoot プロジェクトをデバッグして実行し、ブラウザで HTML フロントエンド ページにアクセスして、プログラムのブレークポイントを設定します。ブレークポイントが設定されていない場合、受信した一時ファイルはプログラムの実行後に自動的に削除されます。具体的な手順は次のとおりです。

次に、ブラウザでフロントエンド ページにアクセスします。

「送信」をクリックすると、プログラムターミナルに次のように表示されます。

 フロントエンドから受信したデータとそのデータが一時的に保存される場所を表示します

まとめ

  • トップページの3つの要素
    • フォーム項目タイプ="ファイル"
    • フォーム送信方法ポスト
    • フォーム multipart/form-data の enctype 属性
  • サーバーは wenjian を受信します
    • マルチパートファイル

ローカルストレージ

成し遂げる

  • サーバー側では、アップロードされたファイルを受信した後、ファイルをローカルサーバーディスクに保存します
  • 具体的なコントロールクラスのコードは以下の通りです。
    • package com.example.tlias.controller;
      
      import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      
      import java.io.File;
      import java.io.IOException;
      
      @RestController
      @Slf4j
      
      public class UpLoadController {
          @PostMapping("upload")
          public Result upload(String username, Integer age, MultipartFile image) throws IOException {
              log.info("文件上传,name:{},age:{},image:{}", username, age, image);
              //  todo 获取原始文件名
              String name = image.getOriginalFilename();
              //  todo 将文件存储在服务器指定的磁盘目录中
              image.transferTo(new File("D:\\downloadFile\\" + name));
              return Result.success();
          }
      
      }
      

psotman でテストする

具体的なリクエストパスとリクエストパラメータは次のとおりです。

対応するファイル ディレクトリは次のように表示されます。

フロントエンドから渡されたファイルをローカルサーバーのディスクに正常に保存しました 

コードの最適化

  • 既存の問題: フロントエンドから渡されるファイル名が同じ場合、ファイルが上書きされる問題が発生します。
  • 問題の解決策: 受信したファイルごとに新しい名前をリセットするだけです. 新しい名前は UUID とファイルのサフィックスで構成されます. UUID は Java に付属の aip を使用して生成され, サフィックスはインターセプトによって取得されますファイルの元の名前。
  • 具体的なコードは次のとおりです。
    • package com.example.tlias.controller;
      
      import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      
      import java.io.File;
      import java.io.IOException;
      import java.util.UUID;
      
      @RestController
      @Slf4j
      
      public class UpLoadController {
          @PostMapping("upload")
          public Result upload(String username, Integer age, MultipartFile image) throws IOException {
              log.info("文件上传,name:{},age:{},image:{}", username, age, image);
              //  todo 获取原始文件名,但是不同文件的原始文件名可能相同
              String name = image.getOriginalFilename();
              // todo 构造唯一文件名--uuid(通用唯一识别码)
              // 获取文件后缀名
              int index = name.lastIndexOf(".");//获取最后的.的索引位置
              String extname = name.substring(index);//进行截取
              String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名
              log.info("获取到的新的文件名为:{}", newName);
              //  todo 将文件存储在服务器指定的磁盘目录中
              image.transferTo(new File("D:\\downloadFile\\" + newName));
              return Result.success();
          }
      
      }
      

postman を使用して同じリクエストを再送信すると、結果は次のようになります。

 

問題が解決しました 

SpringBoot では、ファイルアップロードの場合、単一ファイルのデフォルトの最大サイズは 1M ですが、大きなファイルをアップロードする必要がある場合は、次のように設定できます。

まとめ 

  • String getOriginalFilename() --> 元のファイル名を取得します
  • void transferTo(File dest) --> 受け入れられたファイルをディスクファイルに転送します
  • long getSize() -->ファイルサイズ、単位バイト(byte)を取得 1KB=1024バイト
  • byte[ ] getBytes() --> ファイル内容のバイト配列を取得します。
  • InputStream getInputStream() -->受信したファイル内容の入力ストリームを取得

アリババクラウドOSS

アリ・クラウド

  • Alibaba Cloud は、アリババ グループ傘下の世界有数のクラウド コンピューティング会社であり、中国最大のクラウド サービス プロバイダーです。

アリババクラウドOSS

  • Alibaba Cloud Object Storage OSS (Object Storage Service) は、大規模で安全、低コスト、信頼性の高いクラウド ストレージ サービスです。OSSを利用することで、テキスト、画像、音声、動画などのさまざまなファイルをネットワーク経由でいつでも保存したり呼び出すことができます。

サードパーティのサービスの使用 -- 一般的な考え方

 準備

公式SDKコードを参照してエントリープログラムを記述します。

  • SDKとは、Software Development Kit(ソフトウェア開発キット)の略称で、特定のソフトウェアアプリケーションやプラットフォームを開発するために使用されるツール、ライブラリ、ドキュメントの集合です。SDK は、開発者がソフトウェア アプリケーションをより簡単に作成、テスト、展開するために必要なツールとリソースを提供します。通常、SDK には、コンパイラ、デバッガ、API ドキュメント、サンプル コード、その他の開発ツールに加え、特定のプラットフォームやオペレーティング システムと接続するためのライブラリやコンポーネントが含まれています。開発者は SDK を使用してアプリケーション、プラグイン、拡張機能、またはその他のソフトウェア コンポーネントを構築し、特定のソフトウェア、ハードウェア、またはサービスと統合できます。

統合利用

Alibaba Cloud OSS の使用手順

Alibaba Cloud OSS の使用手順

Alibaba Cloudの登録 --- リチャージ(オプション) --- オブジェクトストレージサービス(OSS)を開く --- バケット作成 --- AccessKey(キー)の取得 --- 公式SDKを参照して記述して使用 --- ケース統合OSS

  • バケット: ストレージ スペースは、ユーザーがオブジェクト (オブジェクト、つまりファイル) を保存するためのコンテナです。すべてのオブジェクトは、特定のストレージ スペースに属している必要があります。

具体的な手順については、次のファイルを参照してください。

【Tencentドキュメント】SpringBootケースに必要なドキュメント
https://docs.qq.com/doc/DUkRiTWVaUmFVck9N

SDKに従ってエントリープログラムを書く

Alibaba Cloud が提供する公式ドキュメントによると、次のように操作できます。

  • まずはJava JDKをインストールします
  • 次に、必要な OSS 操作を実行します。 

     対応するコードをコピーし、独自の情報に従って特定のコードを変更するだけです

ファイルアップロード機能を使用したいのですが、具体的なコードは次のとおりです。

package com.example.tlias;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        // todo 指定OSS服务地址

        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // todo 设置访问凭证

        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        // todo 指定文件所存储的bucket名字(bucketName),以及文件的名称(objectName)

        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        // todo 指定本地要上传的文件

        String filePath = "D:\\localpath\\examplefile.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

特定のパラメータを変更した後、Java プログラムを許可すると、結果は次のようになります。

正常に実行されました 

 そしてファイルごとにアクセスURLアドレスが設定されます

事例統合OSS(ファイルアップロードインターフェースの実装)

 従業員の場合の新入社員インターフェース機能の実装では、従業員アバター情報のアップロードとアバターアップロード機能の実装はまだ実装されていません。インターフェースドキュメントのファイルアップロードインターフェースを参照してください。具体的なリンクは、インターフェースドキュメントはのとおりです。

https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3

 Alibaba Cloud OSS ツールの紹介

package com.example.tlias.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {

    // todo 指定OSS服务地址
    private String endpoint = "你自己的";
    // todo 设置密钥账号和密码
    private String accessKeyId = "你自己的";
    private String accessKeySecret = "你自己的";
    // todo 设置文件存储buket
    private String bucketName = "你自己的";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

コントロールクラス

package com.example.tlias.controller;

import com.example.tlias.pojo.Result;
import com.example.tlias.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j

public class UpLoadController {
    // todo 文件存储到本地
//    @PostMapping("/upload")
//    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
//        log.info("文件上传,name:{},age:{},image:{}", username, age, image);
//        //  todo 获取原始文件名,但是不同文件的原始文件名可能相同
//        String name = image.getOriginalFilename();
//        // todo 构造唯一文件名--uuid(通用唯一识别码)
//        // 获取文件后缀名
//        int index = name.lastIndexOf(".");//获取最后的.的索引位置
//        String extname = name.substring(index);//进行截取
//        String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名
//        log.info("获取到的新的文件名为:{}", newName);
//        //  todo 将文件存储在服务器指定的磁盘目录中
//        image.transferTo(new File("D:\\downloadFile\\" + newName));
//        return Result.success();
//    }
// todo 文件存储至阿里云OSS
    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传至阿里云,文件名:{}", image.getOriginalFilename());
        // 调用阿里云OSS工具进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成,文件url地址为:{}", url);
        return Result.success(url);

    }
}

テスト 

フロントエンドとバックエンドの共同デバッグ 

 

正常に実行されました  

まとめ

ファイルアップロードの概要

フロントエンドページの3要素(ファイルフォームアイテム、ポストメソッド、マルチパート/フォームデータ)

ファイルを受信するサーバー インターフェイス (マルチパート)

ファイルの保存方法

  • ローカル ストレージ (直接アクセスできない、ディスク容量が限られている、ディスクが破損している)
  • クラウドストレージOSS

おすすめ

転載: blog.csdn.net/weixin_64939936/article/details/132383795