大容量ファイルのアップロード
DEXTUploadNJで2GB以上のファイルをアップロードすることを "大容量ファイルアップロード "と言います。DEXTUploadNJはDEXTUpload X5(HTML5ベース)のような弊社のコンポーネント製品と一緒に使用される場合、大容量ファイルアップロードを処理する機能を提供します。大容量ファイルアップロードはDEXTUploadNJ単独ではサポートされず、弊社のコンポーネントと連携してのみ可能であることにご注意ください。
大容量ファイルアップロードは通常のファイルアップロードとは異なる方法で処理されます。通常のファイルアップロードは1回のリクエストで10ファイル全てを送信することができますが、大容量ファイルアップロードは状況によって少なくとも20から数千のリクエストをサーバーに送信することができます。DEXTUploadNJの大容量ファイルアップロード機能はネイティブで連結をサポートしているため、製品は事前にサーバーと通信を行い、ファイルをチャンク単位で送信するため、チャンクの大きさに応じてリクエスト数が増加します。例えば、2.5GBのファイルを10個アップロードし、約10MBずつチャンクに分けて転送する場合、約2500回のリクエストが予想されます。しかし、DEXTUploadNJは断片化されたファイルを1つにまとめる作業を行うので、開発者は合計10回ファイルを宛先に保存(転送)するだけで済みます。
大きなファイルをアップロードする機能は、javax.servlet.Filterインタフェースを実装するExtensionFileUploadFilterクラスによって完全に処理されます。フィルタ・クラスであるため、Java サーブレット・コンテナ(Tomcat など)によって自動的にロードされ、コード・レベルの作成や呼び出しなしで大きなファイルのアップロードを処理します。
DD(web.xml)でExtensionFileUploadFilterフィルタを設定する方法は次のとおりです。
# web.xml <filter> <filter-name>extensionUploadFilter</filter-name> <filter-class>devpia.dextuploadnj.support.common.ExtensionFileUploadFilter</filter-class> <!-- パラメータの設定を省略 --> </filter> <filter-mapping> <filter-name>extensionUploadFilter</filter-name> <!-- 大きなアップロードを処理させたいサーブレットまたはURLをマッピングします。 <servlet-name>サーブレット名</servlet-name> <url-pattern>マッピングURL</url-pattern> --> </filter-mapping>
- サーブレットまたは JSP 環境の場合 (2.5.0 より前のバージョン)
-
ExtensionFileUploadFilter フィルタで処理された一時ファイル情報は、開発者が記述する必要のあるサーブレットや JSP の HttpServletRequest オブジェクトの getAttribute メソッドで取得できます。
// DEXTUPLOADNJ_EXTENSION_FILE_UPLOAD_RESULT をキーとして、フィルタの処理結果を持つ MultipartCollection オブジェクトを取得する。 MultipartCollection multiparts = (MultipartCollection)request.getAttribute(Definition.DEXTUPLOADNJ_EXTENSION_FILE_UPLOAD_RESULT); try { FileItem item = multiparts.getFileItem(0); if (item.isEmpty()) { // ファイルが空の場合、通常は例外を発生させる必要があります。 } // 一時ファイルを実際の保存場所に保存(コピーまたは移動)します。 // 引数としてディレクトリ・パスが与えられない場合、ExtensionFileUploadFilter の defaultRepository パラメータの値によって設定されたパスが対象となります。 String path = item.save(); response.setCharacterEncoding("UTF-8"); response.setContentType("text/plain"); // レスポンス・オブジェクトにはどんな値でも書き込めますが、キーやファイル名、あるいはファイル固有の値を表すパスを書き込むのが一般的です。 response.getWriter().write(path); } finally { if (multiparts != null) { // リソースを削除します。削除されていない一時ファイルはすべて削除されます。 multiparts.deleteTempFiles(); multiparts.clear(); } } - サーブレットまたはJSP環境の場合(2.5.0以降)
-
バージョン2.5.0からは、面倒な前段階のステップを減らし、FileUploadクラスを使ってファイルアイテムを取得することができます。
FileUpload dextnj = null; try { dextnj = new FileUpload(request); dextnj.prepare(); FileItem item = dextnj.getFileItem(); if (item.isEmpty()) { // ファイルが空の場合、通常は例外を発生させる必要があります。 } String path = item.save(); response.setCharacterEncoding("UTF-8"); response.setContentType("text/plain"); response.getWriter().write(path); } finally { if (dextnj != null) dextnj.close(); } - Spring Web Framework環境(2.6.0より前のバージョン)の場合
-
Spring環境では、DD(web.xml)にExtensionFileUploadFilterを設定するだけでなく、DispatcherServletオブジェクトの設定を担当するXMLファイルにMultipartResolverビーンを設定する必要があります。
# web.xml <servlet> <servlet-name>defaultDispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> </servlet>DEXTUploadNJMultipartResolverビーンを宣言するために、dispatcher-servlet.xmlファイルを開いてください。
# dispatcher-servlet.xml <bean id="multipartResolver" class="devpia.dextuploadnj.support.spring.DEXTUploadNJMultipartResolver"/>
CommonMultipartResolverまたはStandardServletMultipartResolver(Springが提供)を設定している場合は、それらを削除する必要があります。これらのBeanはDEXTUploadNJMultipartResolver Beanと同じタスクを実行するので、同時に設定するとエラーになる可能性があります。
ExtensionFileUploadFilter フィルタで処理された一時ファイル情報は、 コントローラにマッピングされたメソッドで MultipartFile オブジェクトとして受け取ることができます。
@RequestMapping(value = "/extension-upload.do", method = RequestMethod.POST) public void upload( // これがDEXTUploadX5製品の場合、"DEXTUploadX5_FileData "として渡される。 @RequestParam(value = "DEXTUploadX5_FileData") MultipartFile file, HttpServletResponse response) throws IOException { // FileItem インターフェースにキャストします。 FileItem item = (FileItem)file; if (item.isEmpty()) { // ファイルが空の場合、通常は例外がスローされます。 // DEXTUploadX5 のようなクライアントは、ファイルがない状態でサーバーにリクエストを送信しないからです。 } String path = item.save(); response.setCharacterEncoding("UTF-8"); response.setContentType("text/plain"); response.getWriter().write(path); } - Spring Web Framework環境用(バージョン2.6.0以降)
-
DEXTUploadNJバージョン2.6.0は、Spring環境で使用するための専用フィルターDEXTUploadNJSpringExtensionUploadFilterを提供します。
# web.xml <filter> <filter-name>extensionUploadFilter</filter-name> <filter-class>devpia.dextuploadnj.support.spring.DEXTUploadNJSpringExtensionUploadFilter</filter-class> <!-- パラメータの設定を省略 --> </filter> <filter-mapping> <filter-name>extensionUploadFilter</filter-name> <!-- 大きなアップロードを処理させたいサーブレットまたはURLをマッピングします。 <servlet-name>サーブレット名</servlet-name> <url-pattern>マッピングURL</url-pattern> --> </filter-mapping>
DD(web.xml)でExtensionFileUploadFilterの代わりにDEXTUploadNJSpringExtensionUploadFilterを使用する場合は、DEXTUploadNJMultipartResolverビーンの設定を省略できます。それ以外は、部分的な ExtensionFileUploadFilter を使用するのと同じです。