Webファイルのダウンロードには2つのタイプがあります。 1つは、ファイルがWebサイトディレクトリにあることです。 http://www.xxx.com/file.zipなど、ブラウザのファイルパスを直接入力してダウンロードできます。別のタイプは、ファイルがWebサイトディレクトリにないか、ファイルが動的に生成されないことです(レポートまたはエクスペルのエクスポートなど)。この場合、ファイルのダウンロードは、応答の出力ストリームを通じて達成する必要があります。 DownloadUtilsは、ファイルのダウンロードを実装するためのさまざまな静的メソッドを提供するJava Webファイルのダウンロードツールクラスです。
パッケージcom.rhui.util; java.io.bufferedinputStreamをインポートします。 java.io.bufferedOutputStreamをインポートします。 java.io.fileをインポートします。 java.io.fileinputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamをインポートします。 java.io.outputStreamをインポートします。 java.net.urlencoderをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 org.apache.commons.lang3.stringutilsをインポートします。 / **ファイルのダウンロードクラス*/ public class downloadutils {/ ***ファイルダウンロードエンコード*このエンコードは、中国語のファイル名をダウンロードするときに小文字化されたコードを防ぐためのファイル名のエンコードメソッドをブラウザに指示します*/ private static string ending = "utf-8"; / **ファイルダウンロード* @param応答* @param filepathファイル名を含むサーバー上のファイルのパス*/ public static void download(httpservletresponse response、string filepath){file file = new file(filepath.tostring());ダウンロード(応答、ファイル、null、エンコード); } /***ファイルダウンロード* @param Response* @param filepathファイル名を含むサーバー上のファイルのパス* @param filenameブラウザーにダウンロードされたファイルの名前。ブラウザによってダウンロードされたファイルの名前がサーバー上のファイル名と同じに表示されたくない場合は、このパラメーター */ public static void download(httpservletResponse応答、文字列filepath、string filename)を設定してください。ダウンロード(応答、ファイル、ファイル名、エンコード); } /***ファイルダウンロード* @param Response* @param filepathファイル名を含むサーバー上のファイルのパス* @param filenameブラウザーにダウンロードされたファイルの名前。ブラウザによってファイル名と同じファイル名と同じファイル名をサーバー上のファイル名とダウンロードしたくない場合は、このパラメーター* @paramエンコードファイル名エンコード*/ public static void download(httpservletresponse応答、文字列filepath、文字列エンコード){file file = new file(filepath.tostring())を設定してください。ダウンロード(応答、ファイル、ファイル名、エンコード); } /** *ファイルダウンロード * @param Response * @paramファイルファイル * @param filenameブラウザにダウンロードされたファイルの名前。ブラウザによってダウンロードされたファイルの名前がサーバー上のファイル名と同じに表示されたくない場合は、このパラメーター */ public static void download(httpservletResponse Response、file file){download(response、file、null、encoding)を設定してください。 } /***ファイルダウンロード* @param Response* @paramファイルファイル* @param filenameブラウザにダウンロードされたファイルの名前。ブラウザによってサーバーにダウンロードされたファイルの名前が必要ない場合は、このパラメーター */ public static void download(httpservletResponse応答、ファイル、ファイル、string filename)を設定してください。 } /***ファイルダウンロード* @param Response* @paramファイルファイル* @param filenameダウンロードされたファイルの名前はブラウザに。ファイル名がサーバー上のファイル名と同じでダウンロードされない場合は、このパラメーター* @paramエンコードファイル名エンコード*/ public static void download(httpservletResponse応答、ファイル、文字列ファイル、文字列エンコード){if(file = null ||! } //ブラウザにダウンロードするファイルの名前を指定しない場合は、ファイルのデフォルト名を使用しますif(stringutils.isblank(filename)){filename = file.getName(); } try {inputstream is = new fileinputStream(file);ダウンロード(Response、is、filename、encoding); } catch(ioexception e){e.printstacktrace(); }} / ***ファイルダウンロード* @param Response* @paramはファイル入力ストリーム* @param filenameダウンロードされたファイル名* @throws ioexception* / public static void download(httpservletresponse応答、inputstream is、string filename){download(response、is、filename、encoding); } / ***ファイルダウンロード* @param応答* @paramはファイル入力ストリームです* @param filenameダウンロードされたファイル名* @paramエンコードエンコードフォーマット* / public static void download(httpservletresponse応答、inputstream is、string filename、string encoding){if(is = = null || null || stringutils.isblink(filename(fillename(filenm)) } bufferedInputStream bis = null; outputStream os = null; BufferedOutputStream bos = null; try {bis = new BufferedInputStream(is); os = response.getOutputStream(); bos = new BufferedOutputStream(OS); Response.setContentType( "Application/Octet-Stream; charset =" + encoding); Response.setcharacterencoding(エンコード); Response.setheader( "content-disposition"、 "attachment; filename ="+ urlencoder.encode(filename、encoding)); byte [] buffer = new byte [1024]; int len = bis.read(buffer); while(len!= -1){bos.write(buffer、0、len); len = bis.read(buffer); } bos.flush(); } catch(ioexception e){e.printstacktrace(); }最後に{if(bis!= null){try {bis.close(); } catch(ioException e){}} if(as!= null){try {is.close(); } catch(ioexception e){}}}} public static string getEncoding(){return encoding; } public static void setEncoding(string encoding){downloadutils.encoding = encoding; }}ファイルがサーバー上の非サイトディレクトリに保存されている場合
文字列filepath = "c://file.zip"; downloadutils.download(response、filepath);
ファイルが入力ストリームの場合
//ファイル入力ストリーム// filenameはブラウザによってダウンロードされたファイル名です//エンコードは、ファイル文字列に中国語がある場合に、文字列filename = "file.zip";文字列encoding = "utf-8"; downloadutils.download(response、is、filename、encoding);
サーブレットでファイルをダウンロードします
パッケージcom.rhui.web.servlet; java.io.ioexceptionをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.annotation.webservletをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 com.rhui.util.downloadutilsをインポートします。 @webservlet( "/download/servlet")public class downloadservletはhttpservletを拡張します{private static final long serialversionuid = 1l;保護されたvoidサービス(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string filepath = "c://file.zip"; downloadutils.download(response、filepath); }} PS:写真のダウンロード(盗難防止リンク機能を含む)
パッケージcn.itcast.day06.web.servlet; java.io.ioexception; Import java.io.inputstream; Import java.io.outputStream; Import java.net.urlencoder; javax.servlet.servletcontext; Import javax.servlet.servletexception; Import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; Import Javax.servlet.http.httpservletredrespposes; public class downloadServletは、httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)を拡張しますservletexception、ioexception {//対リファーヘッダーを実装して、訪問者がString Referer = request.getheader( "Referer"); if(referer == null ||!referer.startswith( "http:// localhost")){//リンクティフrespons.sendredirect( "/day06/index.jsp");戻る ; } //応答の問題を解決する中国の文字化け応答応答。SetContentType( "Text/HTML; charset = utf-8"); //メッセージ本文のエンコードを設定する// HTTPプロトコルを介して送信されたHTTP応答メッセージヘッダーは中国語で表示されません、中国人はURLエンコードされた文字列filename = urlencoder.encode( "Beauty.jpg"、 "utf-8"); //ブラウザにリソースResponse.setheader( "content-disposition"、 "attachment; filename ="+filename)を読み取るように通知します。 //画像データを読み取り、IEブラウザ文字列webpath = "/download/beauty.jpg";に送信します。 //現在のWebアプリケーションServletContext ServletContext = super.getServletContext();のパスに相当します。 inputstream in = servletcontext.getResourceasStream(webpath); outputStream out = response.getOutputStream(); int len; byte [] buffer = new byte [1024]; while((len = in.read(buffer))!= -1)out.write(buffer、0、len); } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}