要件:ファイルのダウンロード機能を備えたWebページを実装し、主に圧縮パッケージと写真をダウンロードします。
1:HyperLinkからダウンロードします
HTMLページで、ハイパーリンクからダウンロードされるファイルのアドレスへのリンク
<!Doctype html> <html> <head> <meta charset = "utf-8"> <title>挿入ここに</head> </head> <body> <body> <h1> link </h1> <a href = "/day06/download/cors.zip">締め切りパッケージ</body> </html>
Day06/ダウンロードがドキュメントパスである場合、この例のプログラム構造は次のとおりです。
プログラムが実行されたら、ダウンロードする必要があるドキュメントをクリックしてダウンロードできます。
ただし、ここに問題が表示されます。つまり、クリックして圧縮パッケージをダウンロードすると、ダウンロードページがポップアップしますが、画像をダウンロードすると、ブラウザが画像を直接開き、ダウンロードはありません。
これは、ハイパーリンクを介してファイルをダウンロードするとき、ブラウザがファイル形式を認識できる場合、ブラウザが直接開くためです。ブラウザがファイル形式を認識できない場合にのみ、ダウンロードが達成されます。したがって、2番目の方法は、ダウンロード機能を実現するために使用されます。
2:Servletプログラムを介してダウンロードを実装します
サーブレットを介してファイルをダウンロードする原則は、サーブレットを介してターゲットプログラムを読み取り、リソースをクライアントに返すことです。
<!Doctype html> <html> <head> <meta charset = "utf-8"> <title>挿入ここに</head> </head> <body> <body> <h1> link </h1> <a href = "/day06/download/cors.zip">締め切りパッケージ<h1>サーブレットプログラムからファイルをダウンロード</h1> <a href = "/day06/servletdownload?filename = cors.zip">圧縮パッケージ</a> <a href = "/day06/servletdownload?filename = 1.png"> picture </a> </body> </html> </html>
/day06 /servletdownloadは、サーブレットプログラムのマッピングパスであり、新しいサーブレット、名前サーブレットダウンロードを作成し、URLが /サーブレットダウンロードにマッピングされます。
次のようにコードを追加します。
パッケージcom.lsgjzhuwei.servlet.response; java.io.fileinputStreamをインポートします。 java.io.fileoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamをインポートします。 java.io.outputStreamをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.annotation.webservletをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 /** *サーブレット実装クラスサーブレットダウンロード */@webservlet(asyncsupported = true、urlpatterns = {"/servletdownload"})public class servletdownloadはhttpservlet {private static final long serialversionuid = 1l; / ** * @see httpservlet#httpservlet() */ public servletdownload(){super(); // todo auto-generated constructor stub}/** * @see httpservlet#doget(httpservletrequest request、httpservletresponse応答) filename = request.getParameter( "filename"); System.out.println(filename); //ファイルMIMEタイプResponse.setContentType(getServletContext()。getMimeType(filename)); // Content-disposition Response.setheader( "content-disposition"、 "attachment; filename ="+filename); //ターゲットファイルを読み取り、応答を使用してターゲットファイルをクライアントに書き込みます//system.out.println(fullfilename); // file inputstream in = new FileInputStream(FullFileName); outputStream out = response.getOutputStream(); //ファイルint bを書き込みます。 while((b = in.read())!= -1){out.write(b); } in.close(); out.close(); } / ** * @see httpservlet#dopost(httpservletrequest request、httpservletresponse応答) Tomcatサーバーを再起動して、圧縮パッケージと写真のダウンロードを実現します。
三つ。ヒント:
ファイルをダウンロードする方法は、リンクをクリックするのが非常に簡単です。バックグラウンドはファイルストリームを出力し、ロケーションやファイルストレージについて問い合わせるなど、ブラウザを介してダウンロード機能を実現します。ほとんどのブラウザは固定場所を構成し、毎回尋ねることはありません。
フロントエンドは非常にシンプルで、<a>タグ、href = "バックエンドメソッドアドレス"があります。ニーズをハイパーリンクモードで直接使用できない場合は、window.location.href = "backendメソッドアドレス"をJSに記述できます。
バックグラウンドメソッドにジャンプした後
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でファイルを取得したい場合は、これが機能します。