Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > オープンソース > Struts −18.ファイルアップロード
更新日:2006/6/5
Struts−18.ファイルアップロード
ここではStrutsでファイルアップロードを行うプログラムを作成する方法を解説します。通常ファイルアップロードを行うプログラムは、複雑なアップロード処理を記述する必要があります。Strutsではこの複雑な処理を行う機能をあらかじめ備えており、プログラマは簡易な処理を記述するだけでファイルアップロードを行うプログラムを作成することができます。

実行環境
・WindowsXP Home Edition
・J2SDK 1.4.2_04
・Tomcat 5.0.18
・Struts 1.2.4
作成概要
Strutsでファイルアップロードを行うプログラムを作成する際は、Strutsであらかじめ用意されているFormFileインタフェースを利用します。ここではFormFileインタフェースを利用してファイルアップロードを行うプログラムを作成する例を解説します。
プログラムは「アップロードするファイルを選択するJSPファイル」、「アップロードするファイルの情報を保有するアクション・フォームBean」、「アップロード処理を行うアクション・クラス」、「アップロード結果を表示するJSPファイル」で構成されています。
【作成ファイル一覧】
ファイル名
内容
「アップロードするファイルを選択するJSPファイル」。<html:file>タグを使用してアップロードを行うファイルを選択します。
「アップロードするファイルの情報を保有するアクション・フォームBean」。ファイルの情報はFormFileインタフェースのオブジェクトとして保有します。
「アップロード処理を行うアクション・クラス」。FormFileインタフェースで用意されているメソッドと入出力クラスを使用してアップロード処理を行います。
「アップロード結果を表示するJSPファイル」。ファイルアップロード後、<bean:write>タグを使用してアップロードを行ったファイル名を表示します。
Strutsプログラムの定義ファイルです。<controller>タグを使用して、アップロードを行うファイルの最大サイズなどを指定します。
作成
exFileUp.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html>
<head><title>FileUpload処理</title></head>
<body>

<%-- (1)enctype属性にmultipart/form-dataを指定 --%>
<html:form action="/FileUpAction" 
           method="POST" 
           enctype="multipart/form-data">
  <%-- (2)ファイル選択を行う<html:file>タグを指定 --%>
  <html:file property="fileUp" />
  <html:submit property="submit" value="送信"/>
</html:form>

</body>
</html:html>
(1). <html:form>タグのenctype属性にmultipart/form-dataを指定します。ファイルアップロードを行う際は必ず指定する必要があります。
(2). <html:file>タグを使用して、FORM画面でアップロードするファイルを選択するボタンを付与します。HTMLタグの<input type="file">タグに該当します。property属性はアクション・フォームBeanで使用するプロパティ名です。
ExFileUploadForm.java
package struts;

import org.apache.struts.action.*;
//(1)FormFileインタフェースのインポート
import org.apache.struts.upload.FormFile;

public final class ExFileUploadForm extends ActionForm {
  //(2)FormFileインタフェースのfileUp変数を宣言
  private FormFile fileUp;

  //(3)アップロードファイル情報に対するアクセスメソッドを宣言
  public FormFile getFileUp() { return fileUp;}
  public void setFileUp(FormFile fileUp) {this.fileUp = fileUp;}

}
(1). ファイルアップロードに関する機能が定義されたインタフェースFormFileをインポートします。
(2). アップロードされたファイルの情報を保有するFormFileインタフェースのfileUpオブジェクト変数を宣言します。
(3). exFileUp.jspで指定したプロパティ名にしたがいアクセスメソッドを宣言します。アクセスメソッドを通して、外部プログラムからアップロードされたファイルの情報を取得、設定します。
ExFileUploadAction.java
package struts;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.io.*;
//(1)FormFileインタフェースのインポート
import org.apache.struts.upload.FormFile;

public final class ExFileUploadAction extends Action {
 public ActionForward execute(ActionMapping mapping, 
        ActionForm form,
        HttpServletRequest req, 
        HttpServletResponse res) throws Exception{
  //(2)アクション・フォームBeanオブジェクトの取得
  ExFileUploadForm efuf = (ExFileUploadForm)form;
  //(3)アクセスメソッドを使用してFormFileオブジェクトの取得
  FormFile fileUp = efuf.getFileUp();

  //(4)getInputStreamメソッドを使用し、入力ストリームを取得
  InputStream is = fileUp.getInputStream();
  //(5)入力ストリームをバッファリング
  BufferedInputStream inBuffer = new BufferedInputStream(is);
  //(6)ファイルのアップロード先を指定して、出力ストリームを生成
  FileOutputStream fos = new FileOutputStream
                         ("/java/Tomcat 5.0/webapps/SExam/files/" 
                         + fileUp.getFileName());
  //(7)出力ストリームをバッファリング
  BufferedOutputStream outBuffer = new BufferedOutputStream(fos);

  int contents = 0;
    
  //(8)入力データがなくなるまで入出力処理を実行
  while ((contents = inBuffer.read()) != -1) {
    outBuffer.write(contents);
  }

  outBuffer.flush();
  inBuffer.close();
  outBuffer.close(); 

  //(9)一時領域のアップロードデータを削除
  fileUp.destroy();

  return (mapping.findForward("success"));
 }
}
(1). ファイルアップロードに関する機能が定義されたインタフェースFormFileをインポートします。
(2). ActionForm型であるformオブジェクトを今回のアクション・フォームBeanであるExFileUploadFrom型にキャストして、オブジェクトefufを取得します。
(3). アクション・フォームBeanで定義したアクセスメソッドを使用して、FormFileインタフェースのオブジェクトを取得します。
(4). getInputStreamメソッドを使用して、アップロードされたファイルの入力ストリームを取得します。
(5). 入力ストリームをバッファリングします。(5)〜(8)はアップロード処理の一例です。ファイル入出力処理を記述することで自由にアップロード処理を記述できます。
(6). アップロード先を指定して、ファイルの出力ストリームを生成します。getFileNameメソッドはアップロードするファイルのファイル名を取得するメソッドです。
(7). 出力ストリームをバッファリングします。
(8). readメソッドにより入力ストリームからデータを読み込み、writeメソッドで出力ストリームに書き出します。readメソッドは入力データがなくなると-1を返します。
(9). destroyメソッドで一時領域に生成されたアップロードデータを削除します。アップロードファイルのサイズが大きい場合、メモリ内のアップロードデータを一時的にある領域に生成します。そのデータを削除します。
exFileUp2.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html:html>
<head><title>FileUpload処理</title></head>
<body>

アップロードしたファイル
<br>
<%-- (1)アップロードファイルのファイル名を表示 --%>
<bean:write name="FileUpForm"
            property="fileUp.fileName" />

</body>
</html:html>
(1). <bean:write>タグを使用し、アップロードファイルのファイル名を表示します。name属性にstruts-config.xmlで指定したアクション・フォームBeanの名前を、property属性にアクション・フォームBeanの参照するプロパティ名を指定します。fileUp.fileNameはfileUpでfileUpプロパティであるFormFileオブジェクトを取得し、fileNameでFormFileオブジェクトで定義されているgetFileNameメソッドの呼び出しを表します。 getFileNameメソッドはアップロードしたファイルのファイル名を取得するメソッドです。
struts-config.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
 "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

  <!-- (1)アクション・フォームBeanの定義 -->
  <form-beans>
    <form-bean
     name="FileUpForm"
     type="struts.ExFileUploadForm"/>
  </form-beans>

  <!-- (2)アクション・クラスの定義 -->
  <action-mappings>
    <action path="/FileUpAction"
     type="struts.ExFileUploadAction"
     name="FileUpForm"
     scope="request">
      <!-- (3)アクション・クラス実行後の遷移先の定義 -->
      <forward name="success" path="/exFileUp2.jsp"/>
    </action>
  </action-mappings>

  <!-- (4)ファイルアップロードに関する定義 -->
  <controller maxFileSize="1024K"
              bufferSize="1024"
              tempDir="/java/Tomcat 5.0/webapps/SExam/tmps" />

</struts-config>
(1). <form-beans>タグでアクション・フォームBeanを指定します。
(2). <action-mappings>タグでアクション・クラス、関連するアクション・フォームBeanを指定します。
(3). <forward>タグでアクション・クラス実行後に返された値"success"に合致する遷移先(exFileUp2.jsp)を指定します。
(4). ファイルアップロードに関する定義を行います。maxFileSize属性はアップロードでいるファイルの最大サイズを指定します。bufferSize属性はアップロードする際にバッファリングする最大サイズを指定します。このサイズを超えた場合一時領域にアップロードデータが生成されます。tempDir属性はアップロードデータが生成される一時領域を指定します。
【実行結果】Strutsの実行方法に関してはJavaの道:Struts(基本操作)を参照してください。
Struts_ファイルアップロード実行結果_1
Struts_ファイルアップロード実行結果_2
一覧
ここでは、FormFileインタフェースで定義されている主なメソッドと、struts-config.xmlの<controller>タグの主な属性について紹介します。
【FormFileインタフェースの主なメソッド】
戻り型
メソッド
説明
void
destroy( )
一時領域に生成されたアップロードデータを即座に削除します。
String
getContentType( )
アップロードファイルのコンテントタイプを返します。
String
getFileName( )
アップロードファイルのファイル名を返します。
int
getFileSize( )
アップロードファイルのサイズを返します。
InputStream
getInputStream( )
アップロードファイルの入力ストリームを返します。
【controllerタグの主な属性】
戻り型
説明
bufferSize
ファイルをアップロードする際のバッファサイズを指定します。アップロードデータが指定した容量を超えると、メモリ内のデータを一時領域に生成します。サイズは(サイズなし)、K(キロバイト)、M(メガバイト)、G(ギガバイト)で指定できます。デフォルトは4096バイトです。
maxFileSize
アップロードできるファイルの最大サイズを指定します。サイズは(サイズなし)、K(キロバイト)、M(メガバイト)、G(ギガバイト)で指定できます。デフォルトは250Mバイトです。
tempDir
一時領域の場所を指定します。アップロードデータのサイズがbufferSizeの値を超えると、メモリ内のデータが指定した一時領域に生成されます。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道