www.dextsolution.com
DEXTUPLOAD
NJ
menu toggle製品の説明 > 大容量ファイルのアップロード

大容量ファイルのアップロード

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 を使用するのと同じです。