I.はじめに
ローカル ストレージを使用してファイル リソースを保存する場合、コア実装プロセスは次のようになります。
- ファイルアップロード、ファイル保存(ローカルディスク)
- 効果を表示するために、ファイル HTTP アクセス サーバーのパスをフロントエンドに返します。
2. 埋蔵量
サーバー側での受信とアップロードの目的は、ファイル アクセス サービスを提供することです。SpringBoot の場合、静的リソース アクセスに対する優れたサポートを提供します。これによって提供される基本的なデフォルト構成を使用することで、開発ニーズを満たすことができます。開発者をサポートし、構成を定義します。
SpringBoot は、デフォルトで次のディレクトリにすべてのアクセスをマップします: **
- クラスパス:/META-INF/リソース
- クラスパス:/static
- クラスパス:/public
- クラスパス:/リソース
次のように、src/main/resources の下に public、resources、static という 3 つの新しいフォルダーを作成し、それぞれ x.png、xx.png、xxx.png という 3 つの画像を配置します。
プロジェクトを開始したら、次の場所にアクセスしてください。
http://localhost:9999/x.png
http://localhost:9999/xx.png
http://localhost:9999/xxx.png
通常は画像リソースを返します。
なお、デフォルトでは SpringBoot は public、resources、static から該当するリソースがあるかどうかを 1 つずつ調べ、あれば直接返します。
ここの静的リソースはすべてクラスパスの下にあることがわかります。次に問題があります。
- アプリケーション ファイル リソースをプロジェクト コードとは別に保存することはできません
- プロジェクトをパッケージ化するのは困難です。アップロードされるファイルが増えると、プロジェクトのパッケージ化された jar がどんどん大きくなっていきます。
- コードとファイルデータを分けて保存できないため、ファイルデータのバックアップが煩雑になる
3. プログラム
SpringBoot は、カスタム静的ファイルの場所を構成するための spring.resources.static-locations を提供します。
spring:
web:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${demo.web.upload-path}
demo:
web:
upload-path: D:/data/
- プロジェクト コードから分離された静的リソース パスとして、demo.web.upload-path を構成します。つまり、ファイルのアップロード、保存のルート パスです。
- spring.web.resources.static-locations を設定する SpringBoot のデフォルトの静的リソース パスを取得することに加えて、外部ファイル リソースのアップロード パスを指す file:${demo.web.upload-path} を追加します。つまり、この下にあります。 path 静的リソースは外部に HTTP アクセス サービスを直接提供できます
4: Java コード
public String upload(MultipartFile file, HttpServletRequest request) {
if (file == null) {
throw new BizException("参数为空");
}
// 在 uploadPath 文件夹中通过日期对上传的文件归类保存
// 例如:/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
String format = sdf.format(new Date());
File folder = new File(uploadPath + format);
if (!folder.isDirectory()) {
folder.mkdirs();
}
// 对上传的文件重命名, 避免文件重名
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString()
+ oldName.substring(oldName.lastIndexOf("."), oldName.length());
try {
// 文件保存
file.transferTo(new File(folder, newName));
// 返回上传文件的访问路径
// 例如:http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
String filePath = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;
return filePath;
} catch (IOException e) {
throw new BizException("系统错误");
}
}
5. シミュレーションファイル
外部アクセスを提供するには、この Upload.html ファイルを classpath:public ディレクトリに置きます。次のように:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择上传文件">
<input type="submit" value="保存">
</form>
</body>
</html>
テストにアクセスし、[ファイルを選択] をクリックして、[保存] をクリックします。
ファイルはサーバー上のdemo.web.upload-pathで指定されたリソースディレクトリに保存されます。
ブラウザ側の応答結果は次のようになり、ファイルの HTTP アクセス パスが返されます。
http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
このHTTPアクセスパスを利用すると、ブラウザ側でのアクセス効果は以下のようになります。これは、ファイルがサーバーに正常にアップロードされたことを証明しており、今後写真にアクセスする必要がある場合は、この HTTP URL を使用するだけです。!!