説明
一方、アップロードするファイルの合計サイズ(その他のデータも含む)が 2GB 未満の場合は、拡張アップロードを使用する必要はありません。
通常アップロードの場合、ファイルが10個ある場合、ORAFは1回の転送で10個すべてのファイルを転送します。OROFモードでアップロードする場合は、個別転送なので10回転送します。一方、Extensionアップロードの場合は、個々のファイルを所定のサイズで分割したチャンク(ブロック)単位でサーバに送信するため、OROFのような個別ファイル転送と同様に最低20回の転送を行う必要があります。
// ファイルアップロードを処理するパスを設定します。
dx.setUploadURL("http://../service/extension-upload.do");
// Extensionアップロードを使用する場合は、"EXTS "に設定する。
dx.setUploadMode("EXTS");
// ファイルを分割するブロックサイズをバイト単位で設定する。
dx.setUploadBlockSize(10 * 1024 * 1024);
DEXTUploadX5は、ファイルを送信する送信者として動作する。一方、DEXTUploadNJはサーバー側でファイルを受信するレシーバーとして動作する。
DEXTUploadNJSpringExtensionUploadFilterフィルタークラスは、分割されたファイルをマージしてサーバー上に一時ファイルを作成する前処理を行います。一時ファイルが作成されると、ExtensionFileServiceControllerに渡されます。
DEXTUploadNJSpringExtensionUploadFilterフィルターをweb.xmlに次のように設定します。
<!-- web.xml --> <filter> <filter-name>extensionUploadFilter</filter-name> <filter-class>devpia.dextuploadnj.support.spring.DEXTUploadNJSpringExtensionUploadFilter</filter-class> <init-param> <param-name>tempRepository</param-name> <param-value>files/temp</param-value> </init-param> <init-param> <param-name>defaultRepository</param-name> <param-value>files/store</param-value> </init-param> <init-param> <param-name>autoMakingDirectory</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>enableCleaner</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>timeAgo</param-name> <param-value>24</param-value> </init-param> <init-param> <param-name>licenseFilePath</param-name> <param-value>WEB-INF/dextuploadnj.config</param-value> </init-param> </filter> <filter-mapping> <filter-name>extensionUploadFilter</filter-name> <url-pattern>*.ext</url-pattern> </filter-mapping>
アップロード情報は、ExtensionFileServiceControllerのマップされたメソッドから受け取ることができます。
/**
* 合計10個のファイルを送信する場合、マッピングメソッドは合計10回呼び出されます。
*/
@RequestMapping(value = "/service/extension-upload.ext", method = RequestMethod.POST)
public void extensionupload(DEXTUploadX5Request x5, HttpServletResponse response) throws IOException {
FileItem item = (FileItem)x5.getDEXTUploadX5_FileData().get(0);
if (item.isEmpty() == false) {
item.save();
...
}
...
}
FileItem#saveメソッドを使って目的の場所に保存すると、DEXTUploadNJSpringExtensionUploadFilterフィルターを使ってサーバー上に大きな一時ファイルを作成するのとは対照的に、非常に時間がかかることがあります。これは、サーバー上の目的の場所に大きなファイルを保存する処理が「コピー」操作によって行われるためです。一時ファイルが作成され、最終的な場所が同じパーティションであれば、「コピー」ではなく「移動」となるため、非常に高速に処理できます。