そういえばそうだった。ずいぶん昔悩んだことがあるのだがすっかり忘れていた。
ファイルをアップロードするのではなく、単純にフルパスだけ Controller に渡してやって、実際のファイルの読み込みは Javaで行いたかったのだが、そういえばセキュリティ上の対策でローカルファイルのフルパスはブラウザからサーバ側には渡せないんだった。
一応、ファイル名を取ってくる処理を Spring Boot + Thymeleaf で書いてみたので、備忘録で載せておく・・・が、ファイル名しか取れないんじゃ意味がないんだよな(^^;;;
(ちなみに、これだけなら Thymeleaf で書かなくても、普通の HTML でいいじゃん・・・というご意見はあるでしょうが、フルパス取れたら色々拡張していこうと思ってたのよね)
■resources/templates/SelectLogs.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="ja">
<head>
<title>対象ログファイル選択</title>
<script>
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('fileInput').addEventListener('change', function(e) {
// 選択されたファイルを取得
const file = e.target.files[0];
const displayArea = document.getElementById('fileNameDisplay');
if (file) {
// ファイル名を表示要素にセット
displayArea.textContent = file.name;
}
else {
// キャンセルされた場合などのリセット処理
displayArea.textContent = 'ファイルが選択されていません';
}
});
});
</script>
</head>
<body>
<form>
<!-- ファイル選択ダイアログ -->
<input type="file" id="fileInput" style="display: none;" />
<!-- ダイアログを呼び出すボタン -->
<button type="button" onclick="document.getElementById('fileInput').click();">
ファイルを選択
</button>
<!-- ファイル名を表示する要素 -->
<span id="fileNameDisplay">ファイルが選択されていません
</form>
</body>
</html>
※注意
ちなみに、addEventListener な処理を頭(head の中とか)に書くと、まだ実際には body部の要素(例えば、'fileNameDisplay' って名前の span要素)が読み込まれていないので、document.getElementById('fileNameDisplay')って指定でエラーになって addEventListener されない。
この場合は、この 'change'イベントの addEventListener を 'DOMContentLoaded'イベント のaddEventListener で囲ってやれば、すべての読み込みが終了後に 'change'tイベント追加処理が実行されるので問題ない。
body の一番後ろに script を書けば良いんだけど、古い人間なので、script は head 内に書きたいのよね(笑)
■java/com/netandfield/test/controller/SelectLogsController.java
package com.netandfield.test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/SelectLogs")
public class SelectLogsController {
/**
* 初期表示
* @return
* @throws Exception
*/
@GetMapping
public String init() throws Exception {
return "SelectLogs";
}
}
ローカルファイルのパスをどうしても Java に渡す処理を Web技術(HTML,CSS,JavaScript)を使って書きたいのなら、Electronなどで「デスクトップアプリ」として作れってことみたい。
Spring Boot と Electron を組み合わせるというのはありだな。Electron でフロントエンドを作り、Spring Boot で Electronデータの画面とデータのやり取りをするだけの REST API を動かすって形で。
なるほど。しかし、これだと Thymeleaf の出番がない?(^^;;; そもそも Thymeleaf の勉強もしたくて、Spring Boot + Thymeleaf の業務システムを作ろう思ったのよね。
ま、ブラウザがサーバにフルパスを渡せられるようになったら「セキュリティ上、大変問題」ってのはわかるので、Electron の勉強するか・・・
電気ウナギ的○○
About Backコメント(0)
電気ウナギ的○○