Servlet でファイル ダウンロード

2009/07/06 14:51Update
TAGS: Java | Servlet | ファイル | ダウンロード

Java Servletでファイルをダウンロードする実装方法について解説します。

以下のその実装手順です。
1)ファイルからレスポンス出力
2)レスポンス設定
HttpServletResponse res = ...
//レスポンス設定
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "filename=\"ファイル名\"");

以下は実際の実装コードです。

Javaコード
ExternalUrlRedirectServlet.java
package mypackage;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ファイルダウンロードServlet
 */
public class FileDownloadServlet extends HttpServlet {
    
    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
     *          javax.servlet.http.HttpServletResponse)
     */
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        
        File fileOut = new File("c:\\out.pdf");    //出力ファイルのフルパス
        
        printOutFile(req, res, fileOut);

    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
     *          javax.servlet.http.HttpServletResponse)
     */
    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        doGet(req, res);
    }

    protected void printOutFile(HttpServletRequest req, 
            HttpServletResponse res, 
            File fileOut)
            throws ServletException, IOException {
        OutputStream os = res.getOutputStream();
        try {
            FileInputStream hFile = new FileInputStream(filePath);
            BufferedInputStream bis = new BufferedInputStream(hFile);

            //レスポンス設定
            res.setContentType("application/octet-stream");
            res.setHeader("Content-Disposition", "filename=\"" + fileOut.getName() + "\"");

            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = bis.read(buffer)) >= 0) {
                os.write(buffer,0, len);
            }
            
            bis.close();
        } catch (IOException e) {
            printOutNotFound(res);
        } finally {
                                                
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                
                } finally {
                    os = null;
                }
            }
        }
    }
    
    private void printOutNotFound(HttpServletResponse res) {
        
        try {
            OutputStream toClient = res.getOutputStream();
            res.setContentType("text/html;charset=utf-8");
            toClient.write("File not found".getBytes());
            toClient.close();
        } catch (IOException e) {
            // do nothing
        }
    }
}


web.xml
...
 <servlet>
  <servlet-name>FileDownloadServlet</servlet-name>
  <servlet-class>mypackage.FileDownloadServlet</servlet-class>
 </servlet>
...
 <servlet-mapping>
  <servlet-name>FileDownloadServlet</servlet-name>
  <url-pattern>/download</url-pattern>
 </servlet-mapping>
...

.

ブラウザで
http://localhost:8080/download
または
http://yourdomain.com/download
へ入力してみます。

ブラウザ側ではダウンロードダイアログが表示されるはず。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation