uploadfile アプリ
Jakarta Faces アプリケーションの例として、フォームからファイルをアップロードしてサーバー側で保存できるシンプルなウェブアプリを作ってみる。
具体的な機能は下記の通り。
1. ブラウザでアクセスするとフォームから選択したファイルをアップロードできる。
2. アップロードしたファイルは /tmp ディレクトリに保存される。
3. 同時にそのファイルがDropbox のストレージにアップロードされる。
サーバー側でのファイルの保存は一時ファイルとして行うだけで、ストレージとしては Dropbox を利用する。使用するDropbox アカウントは事前に作成しておく。
Java プログラムで Dropbox の API を利用するには、Dropbox の Java SDK を使えば良い。API でのアクセスに必要なアクセストークンも事前に取得しておく。
(パーミッション設定でファイルの書き込みができるようにする必要がある)
NetBeans IDE で uploadfile プロジェクトをつくる。ディレクトリ構成は下の画像のようになっている。(resources ディレクトリは空になっている。 glassfish-web.xml も特に使用しておらず、中身は空になっている。)
target ディレクトリはプロジェクトをビルドすると作られるディレクトリなので、最初は存在しない。
pom.xml ファイル
<dependencies> エレメントのみ記載する。
ここではプロジェクトで必要なライブラリを指定している。
uploadfile アプリでは下記の2つを使用する。
・Jakarta JakartaEE API (10.0.0)
・Dropbox SDK Java (5.4.5)
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>10.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dropbox.core</groupId>
<artifactId>dropbox-core-sdk</artifactId>
<version>5.4.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
index.xhtml ページ
ブラウザでの表示画面は下の画像のようボタンが2つあるだけのシンプルな内容となっている。
Browse ボタンをクリックするとファイル選択のダイアログが開き、ファイルを選択するとボタンの横にファイル名が表示される。
Upload File ボタンでファイルをアップロードする。
index.xhtml ファイルの内容を確認する。
<h:body> エレメントのみ掲載。
<h:body>
<h:form enctype="multipart/form-data">
Choose a file to upload to the server:<br/>
<h:inputFile id="input" value="#{ajaxBean.file}" />
<br/>
<h:commandButton action="#{ajaxBean.uploadFile()}"
value="Upload File">
<f:ajax execute="input" />
</h:commandButton>
</h:form>
</h:body>
<h:inputFile> エレメントが Browse ボタンに対応している。
value 属性は ajaxBean オブジェクトの file プロパティに設定されている。この設定により、アップロードしたファイルが Part クラスのオブジェクトとして保持される。
(Part クラスは jakarta.servlet.http パッケージのクラス)
<h:commandButton> の action 属性はこのボタンをクリックしたときに呼ばれるメソッドを ajaxBean.uploadFile() に指定している。
要するに、ファイルをアップロードするとこの uploadFile() メソッドが実行され、サーバー側でのファイルに対する処理が実行されるということ。
<f:ajax /> エレメントはこのアップロードの処理が Ajax で(画面リロードなしで) 実行されるようにするために挿入されている。
AjaxBean クラス
AjaxBean.java では AjaxBean クラスを定義している。
内容の概要は下記の通り。
// package 宣言
// import 宣言 (必要なパッケージのインポート)
// アノテーション (Named, RequestScoped など)
public class AjaxBean {
private static final String ACCESS_TOKEN = xxxxx; // アクセストークン
private Part file = null; // file プロパティ
// file プロパティのセッター
// file プロパティのゲッター
// uploadFile メソッドの定義
// uploadToDropbox メソッドの定義
}
uploadFile メソッドの定義
java.nio.file パッケージのクラスを利用してアップロードされたファイルを /tmp ディレクトリに保存する。その後で uploadToDropbox() を実行。
public void uploadFile() {
try(InputStream is = file.getInputStream();) {
Path path = Files.createTempFile(file.getSubmittedFileName(), null);
Files.copy(is, path, StandardCopyOption.REPLACE_EXISTING);
uploadToDropbox(ACCESS_TOKEN, path.getFileName().toString() );
} catch (IOException | DbxException ex) {
uploadToDropbox メソッドの定義
アップロードされたファイルをDropbox にアップロードする。
Dropbox Java SDK の com.dropbox.core パッケージから必要なクラス等をインポートして使っている。
API の利用に必要なアクセストークンは事前に取得してあるものを使う。
private void uploadToDropbox(String token, String fileName)
throws IOException, DbxException {
DbxRequestConfig config = DbxRequestConfig.newBuilder(
"dropbox/upload"
).build();
DbxClientV2 client = new DbxClientV2(config, token);
InputStream in = file.getInputStream();
client.files().uploadBuilder("/" + fileName).uploadAndFinish(in);
}
その他
このアプリでは実行時のJava のエラーについてはクライアント側への表示は特に行っていない。発生したエラー等は、GlassFish サーバーの管理画面でログファイルを見れば確認できる。
参考資料:
Dropbox の Java SDK についてはDropbox の Developers サイト(下記URL)にあるドキュメントやチュートリアル等を参照。
www.dropbox.com/developers/
コメント: 記事内の情報は著者が個人的に調べた範囲で理解しているものです。必要に応じて訂正する場合があります。記事中に含まれるURL はプロトコルを含めると禁止ワードに引っ掛かるので省いています。
著者・投稿者: ENARTS05
編集履歴:
2023/10/15 作成
2023/10/17 <f:ajax> の使い方について index.xhtml を修正