基本的なアイデア:
以前のアイデアは、ボックスをポップアップしてユーザーにファイルを保存したい場所を尋ねることでした。その後、別のファイルを生成してそこに配置しました。しかし、私の考えは成功しませんでした。
ファイルをダウンロードする方法は、リンクをクリックするのが非常に簡単です。バックグラウンドはファイルストリームを出力し、ロケーションやファイルストレージについて問い合わせるなど、ブラウザを介してダウンロード機能を実現します。ほとんどのブラウザは固定場所を構成し、毎回尋ねることはありません。
フロントエンドは非常にシンプルで、<a>タグ、href = "バックエンドメソッドアドレス"です。ニーズをハイパーリンクで直接使用できない場合は、JSで書くことができます
window.location.href = "バックエンドメソッドアドレス"。
バックグラウンドメソッドにジャンプした後
string filepath = this.getClass()。getClassLoader()。getResource( "")。touri()。getPath() + "/exportpdf.pdf"; //プロジェクトファイルのファイルのパスoutfile = new file(filepath); string filename = outfile.getName(); //ファイル名を取得しますinputstream fis = new BufferedInputStream(new FileInputStream(filePath)); byte [] buffer = new byte [fis.abailable()]; fis.read(buffer); //ファイルストリームfis.close();を読み取ります。 Response.reset(); // ress set set response.addheader( "content-disposition"、 "attachment; filename =" + new String(filename.replaceall( ""、 ").getBytes(" utf-8 ")、" iso8859-1 ")); //ヘッダーファイル名response.addheader( "content-length"、 "" + outfile.length())を返します。 //ヘッダーファイルサイズの応答を返します。SetContentType( "Application/Octet-Stream"); //データ型を設定します// return body出力を取得しますoutputStream os = new BufferedOutputStream(Response.GetOutputStream()); os.write(バッファー); //出力ファイルos.flush(); os.close();
ブラウザは、この形式のファイル出力を直接認識し、ダイアログボックスがポップアップします。
この方法は、リンクメソッドを使用してバックグラウンドで調整する必要があることに注意してください。 AJAXおよびXMLHTTPREQUESTメソッドを使用することはできません。このようにして、返されたファイルストリームはメソッドのコールバック関数に返されます。もちろん、JSでファイルを取得したい場合は、これが機能します。
例
パッケージ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); }}