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

ホーム > 拡張機能のアップロード > 例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はサーバー側でファイルを受信するレシーバーとして動作します。

このサンプルはサーブレット(ExtensionUploadクラス)によって処理され、web.xmlのextension-upload.doにマッピングされます。

ExtensionFileUploadFilterクラスは、分割されたファイルをまとめてサーバー上に一時ファイルを作成する前処理を行います。一時ファイルが作成されたら、アップロードされた結果をExtensionUploadサーブレットに渡します。サーブレット(ExtensionUpload)のコードでは、OROFのように完全なファイルが配信されたかのように扱うことができます。

web.xmlでExtensionFileUploadFilterフィルタを以下のように設定します。

<!--  web.xml -->
<filter>
	<filter-name>extensionUploadFilter</filter-name>
	<filter-class>devpia.dextuploadnj.support.common.ExtensionFileUploadFilter</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>
	<servlet-name>ExtensionUpload</servlet-name>
</filter-mapping>

ExtensionUpload サーブレットでは、FileUpload オブジェクトを使用してファイル情報を受け取ることができます。

FileUpload dextnj = null;
		
try {

	dextnj = new FileUpload(request);
			
	dextnj.prepare();
	  
	// OROF アップロード メソッドと同様に、1 つのファイルのみを処理します。
	FileItem item = dextnj.getFileItem();
	
	if (item.isEmpty() == false) {
		// 引数にディレクトリパスが与えられていない場合は、extensionUploadFilter フィルタの defaultRepository パラメータ値で設定されたパスが対象となります。
		item.save();
		...
	}
	
	...
	
} finally {
	// リソースを削除します。
	if (dextnj != null) dextnj.close();
}

FileItem#saveメソッドを使って目的の場所に保存する場合、ExtensionFileUploadFilterフィルターを使ってサーバー上に大きな一時ファイルを作成するのとは対照的に、非常に時間がかかることがあります。これは、サーバー上の目的の場所に大きなファイルを保存する処理が「コピー」操作によって行われるためです。一時ファイルが作成され、最終的な場所が同じパーティションである場合、「コピー」ではなく「移動」となるため、非常に高速に処理することができます。