ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

F.5.5 サーバのファイルをクライアントへダウンロードしたい

サーバのファイルをクライアントにダウンロードすることができます。 ダウンロードされたファイルは、ブラウザの機能によりファイルの保存ダイアログが開いたり、 ブラウザ内で表示されたりします。

例として、以下のような画面を作成します。

  1. "ダウンロード"ボタンを押すと、クライアント側のファイル保存ダイアログが出力されます。指定したフォルダへファイルが保存されます。

以下の3つの定義が必要です。

定義場所

定義内容

1. 入出力ページ(JSP)

リクエストの送信先の指定と、受信するボタンの追加
1.1 リクエストの送信先の指定
1.2 ダウンロードボタンの追加

2. ビジネスロジック

サーバから送信するファイルの準備

3. サーブレット

ブラウザからのリクエストを受信するためのサーブレットを追加
3.1 サーブレットの追加
3.2 環境ファイルの編集

1. 入出力ページ(JSP)

ダウンロードを依頼するリクエストの送信先(サーブレット)の指定と、ダウンロードを開始するためのボタンを作成します。
以下の2つの定義を追加します。

1.1 リクエストの送信先の指定

uji:formタグのactionアトリビュート属性にリクエストの送信先となるサーブレットを指定します。この例では"download"というサーブレットを指定しています。
この指定は、“3.2 環境ファイルの編集”の<url-pattern>の指定と対応しています。

<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
....
</uji:form>

1.2 ダウンロードボタンの追加

ダウンロードを開始する送信ボタンをINPUTタグで作成します。 この例ではボタンを押すと"dwload"というコマンドを発行しています。コマンドは、INPUTタグのnameアトリビュートに指定しています。

<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
....
<INPUT type="submit" name="dwload" value="ダウンロード">

最終的に作成されるJSPは以下のようになります。

<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="upfile.BodyBean" request="true" />
<uji:form method="post" name="mainForm" action="download" beanId="body" beanCls="upfile.BodyBean" verbs="dwload" >
  <uji:controlState/>
  <INPUT type="submit" name="dwload" value="ダウンロード" >
</uji:form>

2. ビジネスロジック

サーバからクライアントへ送信するファイルを準備します。
ダウンロードを開始するコマンドを処理するメソッドは、Object型を返却する必要があります。
この例では、サーバの "download.zip"ファイルをクライアントへ"download.zip"というファイル名で送信しています。

public Object dwload(DispatchContext context, upfile.BodyBean dataBean) {
    // 送信するサーバのフォルダを求めます。
    // ここでは、アプリケーションの配置と同じフォルダとします。
    String name = "/";
    if(context instanceof HttpDispatchContext) {
        ServletContext svc = ((HttpDispatchContext)context).getServletContext();
        name = svc.getRealPath(name);
    }
    // 送信するサーバ上のファイル名を決定します。
    // ここでは、"download.zip"とします。
    File filename = new File(getRealFolder(context), "download.zip");
    FileInputStream is=null;
    try {
        is = new FileInputStream(filename);
    } catch(Exception e) {
        e.printStackTrace();
    }

    // サーバから送信するファイルと、クライアントで受け取るファイル名を指定します。
    com.fujitsu.uji.util.MimeSource mimesource=null;
    mimesource = new com.fujitsu.uji.util.MimeSource(is,"download.zip");
    mimesource.setContentType("application/octet-stream");
    return (mimesource);
}

3. サーブレット

ブラウザからのリクエストを受信するためのサーブレットを追加します。
以下の2つの処理を追加します。

3.1 サーブレットの追加

サーブレットはcom.fujitsu.uji.http.UjiServletクラスを継承します。
コンストラクタ以外の処理は必要ありません。
この例では、サーブレットを"upfile.DownloadServlet"とします。

package upfile;
public class DownloadServlet extends com.fujitsu.uji.http.UjiServlet {
    public DownloadServlet() {
        super();
    }
}

3.2 環境ファイルの編集

サーブレットを呼び出せるようにweb.xmlを編集し、サーブレットマッピングを定義します。
ここでは、「3.1 サーブレットの追加」で作成した upfile.DownloadServletクラスを、"download" のURLで呼び出せるようにします。

<web-app 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
      version="2.4">
  <servlet>
    <servlet-name>download</servlet-name>
    <servlet-class>upfile.DownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>download</servlet-name>
    <url-pattern>/download</url-pattern>
  </servlet-mapping>
</web-app>

関連項目