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

基本的な例 > 拡張機能のアップロード > 例01

説明

一方、アップロードするファイルの合計サイズ(その他のデータも含む)が 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フィルターを使ってサーバー上に大きな一時ファイルを作成するのとは対照的に、非常に時間がかかることがあります。これは、サーバー上の目的の場所に大きなファイルを保存する処理が「コピー」操作によって行われるためです。一時ファイルが作成され、最終的な場所が同じパーティションであれば、「コピー」ではなく「移動」となるため、非常に高速に処理できます。