Struts 2が複数のファイルアップロードを実現する例
前編のブログで実現したのは単一のファイルアップロードで、今回は複数のファイルアップロードを実現しました.ネーミング仕様は前のブログと同じです.
アイデアは以下の通りです.複数のファイルをアップロードするには、複数のファイルオブジェクトに注入する必要があるので、Actionでは複数のファイルを定義するので、ファイル配列を定義します.この例では,リストを適用して実現する.
実は、アップロードファイルでは、単一のファイルでも複数のファイルでも、アップロードされた一時ファイルやファイルグループ(ループ)からローカルに読み込まれます.
したがってjavaのioベースが重要です.文書の読み書きに遭遇し、ioストリームの基礎がしっかりしていないことに気づき、振り返って馬兵士のioストリームを見直し、ioストリームの小さな例を実践した.ここでioストリームのまとめはブログ「Java IOストリーム分析整理」を参照
マルチファイルアップロードでは、バッファフローを使用してファイルに書き込みます.例は次のとおりです.
struts.xmlプロファイルは、単一のファイルアップロードプロファイルと同様です.
Jspページは次のとおりです.
アップロードファイルのファイルサイズとファイルタイプの制限については、手動で制限する必要はありません.この2つのブログでは、手動でActionにコードを記述し、Struts 2のファイルブロッカーを利用して、プロファイルのActionで直接構成することができます.
アイデアは以下の通りです.複数のファイルをアップロードするには、複数のファイルオブジェクトに注入する必要があるので、Actionでは複数のファイルを定義するので、ファイル配列を定義します.この例では,リストを適用して実現する.
実は、アップロードファイルでは、単一のファイルでも複数のファイルでも、アップロードされた一時ファイルやファイルグループ(ループ)からローカルに読み込まれます.
したがってjavaのioベースが重要です.文書の読み書きに遭遇し、ioストリームの基礎がしっかりしていないことに気づき、振り返って馬兵士のioストリームを見直し、ioストリームの小さな例を実践した.ここでioストリームのまとめはブログ「Java IOストリーム分析整理」を参照
マルチファイルアップロードでは、バッファフローを使用してファイルに書き込みます.例は次のとおりです.
package com.upload;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;
import java.util.Map;
import javassist.bytecode.Descriptor.Iterator;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/*
*
*/
public class MultiUpload extends ActionSupport {
private List<File> file;
private List<String> fileFileName;
private List<String> fileContentType;
//
private Long maximumSize;
//
private String allowedTypes;
public Long getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(Long maximumSize) {
this.maximumSize = maximumSize;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
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 {
String s=null;
File uploadFile =new File(ServletActionContext.getServletContext().getRealPath("file"));
if(!uploadFile.exists())
{
uploadFile.mkdir();
}
boolean[] flags=null;
//
flags=new boolean[file.size()];
//
String[] fileType =allowedTypes.split(",");
//
for(int i=0;i<file.size();i++)
{
flags[i]=false;
//
if(maximumSize<file.get(i).length())
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", " , ");
return "input";
}
//
for(int j=0;j<fileType.length;j++)
{
if(fileContentType.get(i).equals(fileType[j]))
{
flags[i]=true;
}
}
}
//
for(int k=0;k<flags.length;k++)
{
if(flags[k]==false)
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", " ");
return "input";
}
}
//
for(int i=0;i<file.size();i++)
{
FileReader fis=new FileReader(file.get(i));
FileWriter fos=new FileWriter(uploadFile +"\\"+fileFileName.get(i));
BufferedReader br=new BufferedReader(fis);
BufferedWriter bw=new BufferedWriter(fos);
while((s=br.readLine())!=null)
{
bw.write(s);
}
}
return "success";
}
}
struts.xmlプロファイルは、単一のファイルアップロードプロファイルと同様です.
<action name="multiUpload" class="com.upload.MultiUpload">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
<result name="input">input.jsp</result>
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</action>
Jspページは次のとおりです.
<form action="multiUpload" enctype="multipart/form-data" method="post">
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value=" ">
</form>
アップロードファイルのファイルサイズとファイルタイプの制限については、手動で制限する必要はありません.この2つのブログでは、手動でActionにコードを記述し、Struts 2のファイルブロッカーを利用して、プロファイルのActionで直接構成することができます.
<interceptor-ref name="fileUpload">
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>