まず、ファイルのダウンロードの最も単純な例を見てみましょう。
次のようにコードをコピーします。
パッケージcom.yyz.response;
java.io.FileInputStreamをインポートします。
インポート java.io.IOException;
java.io.OutputStreamをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
//ファイルのダウンロード
パブリック クラス ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
文字列 realpath = this.getServletContext().getRealPath("/download/1.gif");
文字列ファイル名 = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("コンテンツの性質", "添付ファイル;ファイル名="+ファイル名);
//サーバーはこのヘッダーを使用して、ブラウザーにデータをダウンロード モードで開くように指示します。
FileInputStream in = 新しい FileInputStream(realpath);
int len = 0;
バイトバッファ[]=新しいバイト[1024];
OutputStream out = 応答.getOutputStream();
while((len = in.read(buffer))>0){
out.write(バッファ, 0, len);
}
in.close();
// クローズする必要はありません。レスポンスが破棄されると、サーバーはレスポンスに関連するストリームを自動的にクローズします。
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
このコードの機能は、サーバーから画像 1.png をダウンロードすることです。 MyEclipse のパッケージ エクスプローラーを使用すると、ディレクトリ構造は次のように表示されます。
もう少し難しくしてみましょう。ダウンロードしたいファイルは中国語の名前のファイルです。 http プロトコルのヘッダー ファイルに含まれるものは ASCII 文字のみであるため、上記の方法 ( String realpath = this.getServletContext().getRealPath("/download/1.gif"); を String realpath = this に直接変更します。 getServletContext().getRealPath("/download/picture.gif");) ファイルを直接取得します。
コード化けの問題が発生します。テスト結果を添付します。
この問題を解決するには、URLEncoder クラスの encode メソッドを使用します。
次のようにコードをコピーします。
パッケージcom.yyz.response;
java.io.FileInputStreamをインポートします。
インポート java.io.IOException;
java.io.OutputStreamをインポートします。
java.net.URLEncoderをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
//中国語ファイルをダウンロードする場合、中国語ファイル名を URL エンコードする必要があります。
パブリック クラス ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
文字列ファイル名 = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//この関数は文字列を URL にエンコードします
FileInputStream in = 新しい FileInputStream(realpath);
int len = 0;
バイトバッファ[]=新しいバイト[1024];
OutputStream out = 応答.getOutputStream();
while((len = in.read(buffer))>0){
out.write(バッファ, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
テスト結果を添付します。
さらに、誰もが注意する必要がある細かい点があります。
FileInputStream の代わりに FileReader を使用することはできません。 FileReader を使用するとデータが失われます。その理由は次のとおりです。FileReader は文字ストリームであり、画像やメディア ファイルなどのデータは 01 形式で保存されます。FileReader で読み取る場合は、エンコード テーブルを参照する必要があります。エンコーディングが指定されていない場合は、対応するプラットフォームのデフォルトのエンコーディングが使用されます。たとえば、中国のコンピュータは GB2312 をチェックします。 GB2312コード表に存在しないコードを読み込んだ場合、データは「?」にエンコードされます。 』とするとデータが中国語になって『? 'ミックス。クライアントに送信後、表示時に再度コード表を確認し、「?」をすべて「?」コードに置き換えるとデータが失われます。この詳細について 1 つだけ覚えておいてください。バイト ストリームはあらゆるタイプのデータを処理できますが、文字ストリームは文字データのみを処理できます。