struts 2ファイルのアップロードとダウンロード


WebプロジェクトにファイルアップロードダウンロードとIO入出力をサポートする2つのjarパッケージをインポートします.名前はcommons-fileupload-1.2.1です.JArとcommons-io-1.4.jar
     
package com.example.struts.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
	//        
	private final static String UPLOADDIR = "/upload";
	//      
	private List<File> file;
	//       
	private List<String> fileFileName;
	//          
	private List<String> fileContentType;

	public List<File> getFile() {
		return file;
	}

	public void setFile(List<File> file) {
		this.file = file;
	}

	public List<String> getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(List<String> fileFileName) {
		this.fileFileName = fileFileName;
	}

	public List<String> getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(List<String> fileContentType) {
		this.fileContentType = fileContentType;
	}

	public String execute() throws Exception {
		for (int i = 0; i < file.size(); i++) {
			//        
			uploadFile(i);
		}
		return "success";
	}

	//      
	private void uploadFile(int i) throws FileNotFoundException, IOException {
		try {
			InputStream in = new FileInputStream(file.get(i));
			String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);
			File uploadFile = new File(dir, this.getFileFileName().get(i));
			OutputStream out = new FileOutputStream(uploadFile);
			byte[] buffer = new byte[1024 * 1024];
			int length;
			while ((length = in.read(buffer)) > 0) {
				out.write(buffer, 0, length);
			}

			in.close();
			out.close();
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}


}

「fileFileName」と「fileContentType」の読者は、特に「fileFileName」はJavaネーミング仕様に合わないような気がしますが、この2つの属性変数は「fileUpload」ブロッカークラスのクラス共通変数名で、このように定義するだけで、UploadAction実行時にページで選択したアップロードファイルの属性値がこの2つの変数に格納されます!
package com.example.struts.action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownLoadAction extends ActionSupport {
	//          
	private final static String DOWNLOADFILEPATH="/upload/";
	//       
	private String fileName;

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	//                    
	public InputStream getDownloadFile() {
		return 
	ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
	}
	//          ,        
	public String getDownloadChineseFileName() {
		String downloadChineseFileName = fileName;

		try {
			downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return downloadChineseFileName;
	}

	public String execute() {
		return SUCCESS;
	}


}

 
	<!--          -->
	<s:form action="upload.action" method="post" enctype="multipart/form-data">
		<tr>
	<!--          -->
	<td>    :<s:file name="file"></s:file></td>
	</tr>
	<tr>
	<td>      :<s:file name="file"></s:file></td>
	</tr>
	<tr>
	<td align="left"><s:submit name="submit" value="  "></s:submit></td>
	</tr>
	</s:form>

 
    :
			<table>
		<!--             -->
		<s:iterator value="fileFileName" status="fn">
		<tr>
		<td>
		<!--         -->
		<s:property />		
		</td>
		<td>
		<!--               Action -->
		<!--            fileName , OGNL      -->	
		<a href="<s:url value='download.action'>  				
                 	<s:param name='fileName'
 value='fileFileName[#fn.getIndex()]'/>  
                 </s:url>">  </a>
		</td>
		</tr>
		</s:iterator>		
		</table>	

 
	<package name="C01" extends="struts-default" namespace="/">
	<!--   Action        Action   -->
		<action name="upload" class="com.example.struts.action.UploadAction">
			<result name="input">/jsp/upload.jsp</result>
			<result name="success">/jsp/result.jsp</result>
			<!--             -->
			<interceptor-ref name="fileUpload">
			<!--             -->
			<param name ="allowedTypes">text/plain,application/xml</param>
			</interceptor-ref >
			<interceptor-ref name="defaultStack"></interceptor-ref >
		</action>
	<!--      Action   -->
		<action name="download" class="com.example.struts.action.DownLoadAction">
			<!--        ,       -->
			<param name="fileName"></param>
			<result name="success" type="stream">
				<!--          -->
				<param name="contentType">text/plain</param>
				<!--          -->
				<param name="contentDisposition">
					attachment;filename="${downloadChineseFileName}"
				</param>
				<!--           -->
				<param name="inputName">downloadFile</param>
			</result>
		</action>
    <action name="index">
    	<result>/jsp/upload.jsp
    	</result>
    </action>
	</package>

「allowedType」というパラメータが定義されています.の間にはファイルタイプがあります.また、「,」間隔で、複数のファイルタイプtxt、xml形式のファイルをアップロードできることを示します.
'.a'      : 'application/octet-stream', 
'.ai'     : 'application/postscript', 
'.aif'    : 'audio/x-aiff', 
'.aifc'   : 'audio/x-aiff', 
'.aiff'   : 'audio/x-aiff', 
'.au'     : 'audio/basic', 
'.avi'    : 'video/x-msvideo', 
'.bat'    : 'text/plain', 
'.bcpio' : 'application/x-bcpio', 
'.bin'    : 'application/octet-stream', 
'.bmp'    : 'image/x-ms-bmp', 
'.c'      : 'text/plain', 
# Duplicates 
'.cdf'    : 'application/x-cdf', 
'.cdf'    : 'application/x-netcdf', 
'.cpio'   : 'application/x-cpio', 
'.csh'    : 'application/x-csh', 
'.css'    : 'text/css', 
'.dll'    : 'application/octet-stream', 
'.doc'    : 'application/msword', 
'.dot'    : 'application/msword', 
'.dvi'    : 'application/x-dvi', 
'.eml'    : 'message/rfc822', 
'.eps'    : 'application/postscript', 
'.etx'    : 'text/x-setext', 
'.exe'    : 'application/octet-stream', 
'.gif'    : 'image/gif', 
'.gtar'   : 'application/x-gtar', 
'.h'      : 'text/plain', 
'.hdf'    : 'application/x-hdf', 
'.htm'    : 'text/html', 
'.html'   : 'text/html', 
'.ief'    : 'image/ief', 
'.jpe'    : 'image/jpeg', 
'.jpeg'   : 'image/jpeg', 
'.jpg'    : 'image/jpeg', 
'.js'     : 'application/x-javascript', 
'.ksh'    : 'text/plain', 
'.latex' : 'application/x-latex', 
'.m1v'    : 'video/mpeg', 
'.man'    : 'application/x-troff-man', 
'.me'     : 'application/x-troff-me', 
'.mht'    : 'message/rfc822', 
'.mhtml' : 'message/rfc822', 
'.mif'    : 'application/x-mif', 
'.mov'    : 'video/quicktime', 
'.movie' : 'video/x-sgi-movie', 
'.mp2'    : 'audio/mpeg', 
'.mp3'    : 'audio/mpeg', 
'.mpa'    : 'video/mpeg', 
'.mpe'    : 'video/mpeg', 
'.mpeg'   : 'video/mpeg', 
'.mpg'    : 'video/mpeg', 
'.ms'     : 'application/x-troff-ms', 
'.nc'     : 'application/x-netcdf', 
'.nws'    : 'message/rfc822', 
'.o'      : 'application/octet-stream', 
'.obj'    : 'application/octet-stream', 
'.oda'    : 'application/oda', 
'.p12'    : 'application/x-pkcs12', 
'.p7c'    : 'application/pkcs7-mime', 
'.pbm'    : 'image/x-portable-bitmap', 
'.pdf'    : 'application/pdf', 
'.pfx'    : 'application/x-pkcs12', 
'.pgm'    : 'image/x-portable-graymap', 
'.pl'     : 'text/plain', 
'.png'    : 'image/png', 
'.pnm'    : 'image/x-portable-anymap', 
'.pot'    : 'application/vnd.ms-powerpoint', 
'.ppa'    : 'application/vnd.ms-powerpoint', 
'.ppm'    : 'image/x-portable-pixmap', 
'.pps'    : 'application/vnd.ms-powerpoint', 
'.ppt'    : 'application/vnd.ms-powerpoint', 
'.ps'     : 'application/postscript', 
'.pwz'    : 'application/vnd.ms-powerpoint', 
'.py'     : 'text/x-python', 
'.pyc'    : 'application/x-python-code', 
'.pyo'    : 'application/x-python-code', 
'.qt'     : 'video/quicktime', 
'.ra'     : 'audio/x-pn-realaudio', 
'.ram'    : 'application/x-pn-realaudio', 
'.ras'    : 'image/x-cmu-raster', 
'.rdf'    : 'application/xml', 
'.rgb'    : 'image/x-rgb', 
'.roff'   : 'application/x-troff', 
'.rtx'    : 'text/richtext', 
'.sgm'    : 'text/x-sgml', 
'.sgml'   : 'text/x-sgml', 
'.sh'     : 'application/x-sh', 
'.shar'   : 'application/x-shar', 
'.snd'    : 'audio/basic', 
'.so'     : 'application/octet-stream', 
'.src'    : 'application/x-wais-source', 
'.sv4cpio': 'application/x-sv4cpio', 
'.sv4crc' : 'application/x-sv4crc', 
'.swf'    : 'application/x-shockwave-flash', 
'.t'      : 'application/x-troff', 
'.tar'    : 'application/x-tar', 
'.tcl'    : 'application/x-tcl', 

'.tex'    : 'application/x-tex', 
'.texi'   : 'application/x-texinfo', 
'.texinfo': 'application/x-texinfo', 
'.tif'    : 'image/tiff', 
'.tiff'   : 'image/tiff', 
'.tr'     : 'application/x-troff', 
'.tsv'    : 'text/tab-separated-values', 
'.txt'    : 'text/plain', 
'.ustar' : 'application/x-ustar', 
'.vcf'    : 'text/x-vcard', 
'.wav'    : 'audio/x-wav', 
'.wiz'    : 'application/msword', 
'.wsdl'   : 'application/xml', 
'.xbm'    : 'image/x-xbitmap', 
'.xlb'    : 'application/vnd.ms-excel', 
# Duplicates 
'.xls'    : 'application/excel', 
'.xls'    : 'application/vnd.ms-excel', 
'.xml'    : 'text/xml', 
'.xpdl'   : 'application/xml', 
'.xpm'    : 'image/x-xpixmap', 
'.xsl'    : 'application/xml', 
'.xwd'    : 'image/x-xwindowdump', 
'.zip'    : 'application/zip', 

firefox   ie         
Java   
firefox image/jpeg image/bmp image/gif image/png  

ie 6 image/pjpeg image/bmp image/gif image/x-png  

ie 7 image/pjpeg image/bmp image/gif image/x-png  

ie 8 image/pjpeg image/bmp image/gif image/x-png

 .ここでは、ファイルタイプをアップロードできます.