Storage¶
Storageとは¶
Storageは分散システムで intra-mart Accel Platform を利用しているときに、アップロードされたファイルやシステムで共有したいファイル(主にデータファイル)を一元管理します。コラム
分散システムを構築する場合、各 Web Application Server で共有するディレクトリを設定しておく必要があります。詳細はセットアップガイドを参照してください。
Storageの種類¶
SystemStorage
システムで利用するファイルを保存する領域です。主に、 intra-mart Accel Platform の基盤APIやアプリケーション内の処理で利用されます。PublicStorage
アップロードされたファイルや利用者間で共有したいファイルを保存する領域です。Storageにファイルを保存する場合は、基本的にPublicStorageに保存します。SessionScopeStorage
一時的にファイルを保存する領域です。処理の途中でアップロードされたファイルや保存されたデータを一時的に保存したい場合に利用します。SessionScopeStorageに保存されたファイルは、セッションの有効期間が切れたタイミングで自動的に削除されます。
ストリーミング¶
intra-mart Accel Platform ではStorageの保存されているデータをストリームで扱うことができるようになりました。ストリームを利用することで、従来のintra-mart WebPaltformのように一度 Web Application Server のメモリ上にファイルデータを持つ必要がなくなり、サイズの大きいファイルのアップロードやダウンロードが行えるようになります。コラム
Storage APIのload(),read(),save(),write()メソッドを使用するとファイルデータがAPサーバのメモリ上に展開されるため、メモリを圧迫します。その為、これらのメソッドの利用は推奨しません。
プログラミング方法¶
ファイルアップロード¶
ここでは、PublicStorage内の”sample”ディレクトリにファイルをアップロードする例を示します。
- Formクラス
public class UploadForm { @Required public FormFile formFile; }
- Actionクラス
public class UploadAction { @ActionForm @Resource protected UploadForm uploadForm; /** * クライアントよりアップロードされたファイルをPublicStorageに保存します。 */ @Execute(input = "index.jsp") public String upload() { // Formクラスよりアップロードされたファイルを取得します。 FormFile file = uploadForm.formFile; // ファイル保存先を指定したPublicStorageのインスタンスを生成します。 PublicStorage storage = new PublicStorage("sample", file.getFileName()); // アップロードされたファイルをPublicStorageに書き込みます。 IOUtil.transfer(file.getInputStream(), storage.create()); return "index.jsp"; } }
ファイルダウンロード¶
ここでは、PublicStorage内のファイル”sample.txt”をダウンロードする例を示します。public class DownloadAction { @Resource protected HttpServletResponse response; /** * PublicStorageに保存されているファイル「sample.txt」をクラアントへ送信します。 */ @Execute(validator = false) public String download() { try { // sample.txtを指定したPublicStorageのインスタンスを生成します。 PublicStorage storage = new PublicStorage("sample.txt"); if(!storage.isFile()) { // ファイルが存在しない場合は例外をスローします。 throw new FileNotFoundException(); } // クライアントへsample.txtを送信します。 ResponseUtil.download(storage.getName(), new BufferedInputStream(storage.open(), storage.length())); } catch (IOException e) { throw new IORuntimeException(e); } } }