複数ファイルのアップロードメモ
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/plaina
- 7d81d41e2069a
Content-Disposition: form-data; name="files[1]"; filename="C:\tmp\b.txt"
Content-Type: text/plainb
- 7d81d41e2069a
Content-Disposition: form-data; name="files[2]"; filename="C:\tmp\c.txt"
Content-Type: text/plainc
- 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にすれば(何個になるかわからない)複数ファイルもいけるらしい。