複数ファイルのアップロードメモ

input JSP

<html:form action="/upload" enctype="multipart/form-data">
File1:<html:file property="files[0]" /><br/>
File2:<html:file property="files[1]" /><br/>
File3:<html:file property="files[2]" /><br/>
<html:submit property="submit" value="upload"/>
</html:form>

output JSP

File1:<bean:write name="uploadForm" property="files[0].fileName"/><br/>
File2:<bean:write name="uploadForm" property="files[1].fileName"/><br/>
File3:<bean:write name="uploadForm" property="files[2].fileName"/><br/>

ActionForm

public class UploadForm extends ValidatorForm {
	
	private FormFile[] files = new FormFile[3];

	public FormFile[] getFiles() {
		return files;
	}
	public void setFiles(FormFile[] files) {
		this.files = files;
	}

Action

		UploadForm uploadForm = (UploadForm) form;

		FormFile[] formFiles = uploadForm.getFiles();

		for (FormFile formFile : formFiles) {
			InputStream is = formFile.getInputStream();
			byte[] buf = new byte[4096];
			int bufsize = 0;
			OutputStream os = new FileOutputStream("C:\\" + formFile.getFileName());
			while ((bufsize = is.read(buf, 0, 4096)) != -1) {
				os.write(buf, 0, bufsize);
			}
			os.close();
			is.close();

			formFile.destroy();
		}

validation.xml

        <form name="uploadForm">
        	<field property="files[0]" depends="required"></field>
        	<field property="files[1]" depends="required"></field>
        	<field property="files[2]" depends="required"></field>
	</form>

こんな感じでやればバリデーション込みでできる。

HTTPリクエストは以下。

                                                          • 7d81d41e2069a

Content-Disposition: form-data; name="files[0]"; filename="C:\tmp\a.txt"
Content-Type: text/plain

a

                                                          • 7d81d41e2069a

Content-Disposition: form-data; name="files[1]"; filename="C:\tmp\b.txt"
Content-Type: text/plain

b

                                                          • 7d81d41e2069a

Content-Disposition: form-data; name="files[2]"; filename="C:\tmp\c.txt"
Content-Type: text/plain

c

                                                          • 7d81d41e2069a

Content-Disposition: form-data; name="submit"

upload

                                                          • 7d81d41e2069a--

いや、でもこれだとファイル数が3で固定になるな。(何個になるかわからない)複数ファイルを
アップロードする場合は。。。なんか見たことがある気がするんだが。。。

あとStrutsのバリデーションの仕組みをSAStrutsアノテーションからどう連携しているかも調べてみると面白そう。

追記:
参考:http://muimi.com/j/jakarta/struts/struts3.html

http://omameken.web.fc2.com/contents/struts/fileupload3.html
みたいにArrayListにすれば(何個になるかわからない)複数ファイルもいけるらしい。