sitelink1 | |
---|---|
sitelink2 | |
extra_vars5 | 1 |
extra_vars6 | ko |
アプリケ?ション?要
ファイルをアップロ?ドして、ファイル名とかサイズとかを表示するだけ。アップロ?ドされたファイルは「/WEB-INF/upload」フォルダに保存される。
スクリ?ンショット
ソ?ス?明
全??
必要なjar
- commons-fileupload-1.1.1.jar
- commons-io-1.1.jar
- commons-logging-1.0.4.jar
- freemarker-2.3.8.jar
- log4j-1.2.14.jar
- ognl-2.6.11.jar
- struts2-core-2.0.6.jar
- xwork-2.0.1.jar
FileUploadSampleAction.java
package struts2.sample10;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* ファイルアップロ?ドのサンプル。
*/
@SuppressWarnings("serial")
@Results({
@Result(name="input",value="upload_input.jsp"),
@Result("upload_result.jsp")
})
public class FileUploadSampleAction extends ActionSupport {
/** アップロ?ドファイル */
private File upload;
//
// strutsが勝手に値をセットしてくれるプロパティ
//
/** ファイルのContent-Type(プロパティ名+「ContentType」) */
private String uploadContentType;
/** ファイル名(プロパティ名+「FileName」) */
private String uploadFileName;
//
// ?面表示用のプロパティ
//
/** ファイルサイズ */
private String fileSize;
/**
* 初期表示メソッド
*/
public String input(){
return "input";
}
/**
* アクションを?行するメソッド。
*/
public String execute() throws IOException{
// 「/WEB-INF/upload」にファイルをコピ?してみよう
ActionContext ac = ActionContext.getContext();
ServletContext sc =
(ServletContext)ac.get(StrutsStatics.SERVLET_CONTEXT);
File uploadDir = new File(sc.getRealPath("/WEB-INF/upload"));
if(uploadDir.exists() == false){
uploadDir.mkdirs();
}
FileUtils.copyFile(upload, new File(uploadDir, uploadFileName));
// ファイルサイズをセットする
fileSize = FileUtils.byteCountToDisplaySize(upload.length());
return "success";
}
//
// setter と getter
//
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
}
ファイルのアップロ?ドを?理するアクションクラス。
アップロ?ドされたファイルは、strutsが勝手に一時フォルダに保存します。
そんで、そのファイルを示すjava.io.Fileクラスのオブジェクトが、プロパティ(ここではupload)にセットされます。
その他に、ファイルの種類(「text/plain」みたいなの)を表す文字列が「●●●●ContentType」(●●●●はアップロ?ドファイルのプロパティ名)にセットされます。
さらに、ファイル名が「●●●●FileName」にセットされます。
アクションクラスがActionSupportを?承すると、アップロ?ドの際に入力チェックがかかるようになります。
アップロ?ドしたファイルのサイズが上限を超えていた場合に、エラ?メッセ?ジがセットされて「input」の?面に?されるわけですな。
struts.properties
# アップロ?ドされたファイルが一時的に保存されるディレクトリ
# デフォルトでは、規定のtempディレクトリ(jspをjavaソ?スに?換したものが置かれ
# たりするフォルダ)に設定される。
# 指定しないでデフォルトに任せた方が良いと思う。
#struts.multipart.saveDir=upload_temp
# アップロ?ドファイルのサイズ上限(?位:バイト)
struts.multipart.maxSize=10485760
ファイルのアップロ?ドに?する設定を書くことができます。
今回はクラスパスのル?トフォルダに作ってるので全?に適用されますが、アクションクラスと同じ名前のプロパティファイルに書けば、そのアクションクラスだけに適用されるみたいです。
(今回の例で言うと「struts2/sample10/FileUploadSampleAction.properties」
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>ファイルアップロ?ド</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>struts2.sample10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
いつもどおり
index.jsp
<% response.sendRedirect("fileUploadSample!input.action"); %>
index.jspを用意して、アクションのURLにリダイレクトするようにしました。(本編とはあんまり?係ありません。)
upload_input.jsp
<%@page pageEncoding="utf-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<s:actionerror/>
<s:fielderror/>
<s:form action="fileUploadSample" method="post" enctype="multipart/form-data">
<s:file name="upload" label="アップロ?ド" size="80"/>
<s:submit name="送信"/>
</s:form>
入力?面。
ファイルのアップロ?ドをするときには、formタグに「enctype="multipart/form-data"」って書かないといけません。
ほんで、そのフォ?ムタグの中に<s:file>タグというのを書いてアップロ?ドの項目を作ればよいです。
<s:file>タグのname?性がアクションクラスのFileプロパティになります。
upload_result.jsp
<%@page pageEncoding="utf-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<h1>正常終了</h1>
<table>
<tr>
<td>ファイル名</td>
<td><s:property value="uploadFileName"/></td>
</tr>
<tr>
<td>ファイルの種類</td>
<td><s:property value="uploadContentType"/></td>
</tr>
<tr>
<td>ファイルサイズ</td>
<td><s:property value="fileSize"/></td>
</tr>
</table>
アップロ?ド結果の?面
ファイル名とファイルの種類とファイルサイズを出力してます。
こんな感じでファイルのアップロ?ドはできました。
本家のサンプルを見てみると、複?ファイルのアップロ?ドも案外手?にできるみたいなことが書いてました。
File[]とかListのプロパティを作っておけば勝手にセットしてくれるみたいな感じでしたが、?際に試してないので確かではないです。
またネタに困ったらやってみようと思います。