Webアプリケーションシステムの開発では、ファイルアップロードおよびダウンロード関数は非常に一般的に使用されています。今日は、Javawebでファイルアップロードとダウンロード機能の実装について話しましょう。
ファイルアップロード概要
1。ファイルアップロードの関数
たとえば、ネットワークハードドライブ!ファイルをアップロードおよびダウンロードするために使用されます。
Zhilian Recruitmentの完全な履歴書を埋めるには、写真をアップロードする必要もあります。
2。ページアップロードの要件
ファイルをアップロードするための多くの要件があります、覚えておいてください:
フォームを使用する必要があり、ハイパーリンクフォームの方法ではなく、getではなく投稿する必要があります
フォームのenctypeは、MultiPart/Form-Dataでなければなりません
フォームにファイルフォームフィールドを追加します。
<form action = "$ {pagecontext.request.contextpath}/fileuploadservlet" method = "post" enctype = "multipart/form-data"> username:<input type = "text" name = "username"/> <br/>ファイル1:<入力タイプ= "ファイル"ファイルname = "file2"/> <br/> <入力タイプ= "submit" value = "submit"/> </form>3.ファイルアップロードフォームと通常のテキストフォームの違いを比較する
httpwatchを介して「ファイルアップロードフォーム」と「通常のテキストフォーム」の違いを表示します。
ファイルアップロードformのenctype = "multipart/form-data"。これは、マルチパートフォームデータを表します。
通常のテキストフォームは、enctype属性を設定せずに設定できます。
method =” post”の場合、enctypeのデフォルト値はアプリケーション/x-www-form-urlencodedです。つまり、method = "get”が使用される場合、enctypeのデフォルト値はnullであり、テキストはありません。
<form action = "$ {pagecontext.request.contextpath}/fileuploadservlet" method = "post"> username:<input type = "text" name = "username"/> <br/> file 1:<入力タイプ= "ファイル" name = "file1"/> <br/>ファイルvalue = "submit"/> </form>httpwatchテストを通じて、フォームのリクエストデータ本文を調べると、リクエストにはファイル名のみがあるが、ファイルコンテンツはないことがわかりました。つまり、フォームのenctypeがMultiPart/Form-Dataではない場合、リクエストにはファイルコンテンツが含まれていませんが、ファイル名のみが含まれています。つまり、入力の間に違いはありません。
ファイルアップロードフォームのテスト:
<form action = "$ {pagecontext.request.contextpath}/fileuploadservlet" method = "post" enctype = "multipart/form-data"> username:<input type = "text" name = "username"/> <br/>ファイル1:<入力タイプ= "ファイル"ファイルname = "file2"/> <br/> <入力タイプ= "submit" value = "submit"/> </form>httpwatchテストを通じて、フォームの要求データの本体部分を表示し、本体部分が複数のコンポーネントで構成されていることを発見し、各コンポーネントはフォームフィールドに対応し、各コンポーネントには独自のヘッダー情報があります。ヘッダー情報の下には空白があり、空白線の下にはフィールドのボディ部分があります。ランダムに生成された仕切りによって複数の部品が分離されます。
テキストフィールドのヘッダー情報には、1つのヘッダー情報、つまりコンテンツディスポジションのみが含まれています。このヘッダー情報の値には2つの部分があります。最初の部分は固定されています。つまり、フォームデータ、2番目の部分はフィールドの名前です。空白線の後ろには主要な部分があり、主な部分はテキストボックスに記入されたコンテンツです。
ファイルフィールドのヘッダー情報には、コンテンツディスポジションとコンテンツタイプの2つのヘッダーが含まれています。アップロードされたファイル名を指定するコンテンツディスポジションには追加のファイル名があります。コンテンツタイプアップロードされたファイルのタイプを指定します。ファイルフィールドの主要部分は、ファイルのコンテンツです。
アップロードされたファイルはすべて通常のテキストファイル、つまりTXTファイルであるため、通常はhttpwatchに表示できることに注意してください。アップロードされたファイルがexe、mp3などの場合、httpwatchで表示されるものは文字化けします。
4。ファイルをアップロードする際のサーブレットの要件
送信されたフォームがファイルアップロードフォームである場合、サーブレットの要件もあります。
まず、ファイルアップロードフォームのデータもリクエストオブジェクトにカプセル化されていることを確認する必要があります。
request.getParameter(string)メソッドは指定されたフォームフィールド文字コンテンツを取得しますが、ファイルのアップロードフォームは文字コンテンツではなくバイトコンテンツであるため、無効です。
この時点で、getInputStream()リクエスト方法を使用して、servletinputStreamオブジェクトを取得できます。 inputstreamのサブクラスです。このservletinputStreamオブジェクトは、フォーム全体の本体部分(最初の仕切りから最後まで)に対応しており、必要な解析ストリームにデータが表示されます。もちろん、それを解析することは非常に厄介なことであり、アパッチはそれを解析するためのツールを提供してくれました:commons-fileupload
request.getInputStream()ストリームの内容を印刷して、httpwatchのリクエストデータを比較してみてください。
public void dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {inputstream in = request.getinputStream();文字列s = ioutils.tostring(in); System.out.println(s);}----------------------------- 7DDD3370AB2Content-Disposition:Form-Data; name = "username" hello ---------------------------- 7ddd3370ab2content-disposition:form-data; name = "file1"; filename = "a.txt" content-type:text/plainaaa -------------------------- 7ddd3370ab2content-disposition:form-data; name = "file2"; filename = "b.txt" content-type:text/plainbbb -------------------------- 7ddd3370ab2----------------------------------------------------
commons-fileupload
Fileuploadを使用する理由:
ファイルをアップロードするための多くの要件があります、覚えておいてください:
投稿フォームでなければなりません。
フォームのenctypeは、MultiPart/Form-Dataでなければなりません。
フォームにファイルフォームフィールドを追加します。
サーブレットの要件:
request.getParameter()を使用してフォームデータを取得できなくなりました。 request.getInputStream()を使用して、フォームアイテムのデータではなく、すべてのフォームデータを取得できます。これは、fileuploadを使用しないことを意味し、request.getinputStream()のコンテンツを解析する必要があります。
1。fileuploadの概要
Fileuploadは、ApacheのCommonsコンポーネントが提供するアップロードコンポーネントです。その主な仕事は、リクエストを解析するのを助けることです。getinputStream()
Fileuploadコンポーネントが必要とするJARパッケージは次のとおりです。
commons-fileupload.jar、コアパッケージ
Commons-Io.jar、依存関係パッケージ
2。fileuploadの簡単なアプリケーション
fileuploadのコアクラスは、diskfileitemactory、servletfileupload、fileitemです
Fileuploadコンポーネントを使用する手順は次のとおりです。
// 1。 Factory Class DiskFileItemFactory DiskFileItemFactory = new DiskFileItemFactory(); // 2を作成します。 Factory ServletFileupload fileupload = new ServletFileupload(Factory); // 3を使用してパーサーオブジェクトを作成します。パーサーを使用して、リクエストオブジェクトリスト<fileitem> list = fileupload.parserequest(request);
diskfileitemactoryディスクファイルアイテム工場クラス
public diskfileitemactory(int syzethreshold、fileリポジトリ)
工場を構築するときは、メモリバッファーのサイズと一時ファイルストレージの場所を指定します。
public void setsizetheshold(int syzethreshold)
メモリバッファサイズ、デフォルト10kを設定します
public void setRepository(ファイルリポジトリ)
一時的なファイルストレージの場所、デフォルトSystem.getProperty( "java.io.tmpdir")を設定します。
メモリバッファ:ファイルをアップロードするとき、アップロードされたファイルのコンテンツが最初にメモリバッファに保存されます。アップロードされたファイルサイズがバッファサイズを超えると、サーバー側で一時ファイルが生成されます。
一時的なファイルストレージ場所:メモリバッファサイズを超えるファイルをアップロードして、一時ファイルを生成します。一時的なファイルは、fileItemのdelete()メソッドを介して削除できます
fileItemは、ファイルアップロードフォームのデータの各部分を表します
FileItemクラスを厳soleに紹介します。これは、最終的な結果です。 FileItemオブジェクトは、フォームアイテム(フォームフィールド)に対応します。ファイルフィールドと通常のフィールドは形式で存在します。 FileItemクラスのISFormField()メソッドを使用して、フォームフィールドが通常のフィールドであるかどうかを判断できます。それが通常のフィールドでない場合、それはファイルフィールドです。
注:ファイルアップロードフォームは、従来のURLエンコードとは異なるMultiPart/Form-Dataを使用してエンコードされているため、すべてのgetParameter()メソッドはSetChareCterencoding()を使用できません。
servletfileuploadファイルコアクラスをアップロードします
3.簡単なアップロード例
簡単なアップロードの例を書きます:
フォームには、ユーザー名フィールドとファイルフィールドが含まれています。
サーブレットは、アップロードされたファイルをアップロードディレクトリに保存し、ユーザー名、ファイル名、ファイルサイズ、ファイルタイプを表示します。
最初のステップ:
index.jspを完了するには、1つのフォームのみが必要です。フォームはポストでなければならず、enctypeはmulitpart/form-dataでなければならないことに注意してください
<form action = "$ {pagecontext.request.contextpath}/fileuploadservlet" method = "post" enctype = "multipart/form-data"> username:<input type = "text" name = "username"/> <br/>ファイル1:<入力タイプ= "ファイルvalue = "submit"/> </form>ステップ2: FileuploadServletを完了します
public void dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {//応答で印刷するため、エンコードResponse.setContentType( "text/html; charset = utf-8"); // Factory DiskFileItemFactory dfif = new DiskFileItemFactory(); // Factory ServletFileupload fileupload = new ServletFileupload(DFIF)を使用してパーサーオブジェクトを作成します。 try {//パーサーオブジェクトを使用してリクエストを解析し、fileItemリスト<fileitem> list = fileupload.parserequest(request); //すべてのフォームアイテム(fileitem fileitem:list){//現在のフォームアイテムが通常のフォームアイテムの場合if(fileitem.isformfield()){//現在のフォームアイテムのフィールド名= fileItem.getFieldName(); //現在のフォームアイテムのフィールド名がユーザー名の場合if(fieldname.equals( "username")){//現在のフォーム項目のコンテンツ、つまり、username form item response.getWriter()。印刷( "username:" + fileitem.getString() + "<br/>"); }} else {//現在のフォームアイテムが通常のフォームアイテムではない場合、ファイルフィールド文字列名= fileItem.getName(); //アップロードされたファイル名の名前を取得します//アップロードされたファイル名が空である場合、アップロードされたファイルが指定されていない場合、(name == null || name.isempt()) } // $ {Project Directory}/uploadsに対応する実際のパスを取得します。もちろん、このディレクトリには文字列savepath = this.getServletContext()。getRealPath( "/uploads"); // uploadsディレクトリとファイル名ファイルファイル= newファイル(SavePath、name)を介してファイルオブジェクトを作成します。 // fileを指定された場所fileitem.write(file)にアップロードします。 //アップロードファイルresponse.getWriter()の名前を印刷()。 //アップロードfile response.getWriter()のサイズを印刷します。print( "file size:" + fileitem.getSize() + "<br/>"); //アップロードされたfile response.getWriter()のタイプを印刷()。印刷( "file type:" + fileitem.getContentType() + "<br/>"); }}} catch(Exception e){新しいservletexception(e); }}ファイルのアップロード詳細
1.アップロードされたファイルをWeb-INFディレクトリに配置します
ユーザーがアップロードしたファイルがWeb-INFディレクトリに保存されていない場合、ユーザーはブラウザを介してアップロードされたファイルに直接アクセスできます。これは非常に危険です。
ユーザーがA.JSPファイルをアップロードし、ユーザーがブラウザを介してA.JSPファイルにアクセスすると、A.JSPのコンテンツが実行されます。 a.jspに次のステートメントがある場合:runtime.getRuntime()。exec( "Shutdown st 1");それならあなたは...
通常、Web-INFディレクトリにアップロードされたディレクトリを作成して、アップロードされたファイルを保存します。サーブレットでこのディレクトリを見つけるには、servletcontextのgetRealPath(String)メソッドを使用する必要があります。たとえば、私のupload1プロジェクトには次のステートメントがあります。
servletcontext servletcontext = this.getServletContext(); string savepath = servletcontext.getRealPath( "/web-inf/uploads");
SavePathは次のとおりです。f:/tomcat6_1/webapps/upload1/web-inf/uploads。
2。ファイル名(フルパス、ファイル名)
アップロードされたファイル名はフルパスかもしれません:
IE6によって取得されたアップロードファイル名はフルパスですが、他のブラウザで取得されたアップロードファイル名はファイル名です。ブラウザの違いの問題にまだ対処する必要があります
string name = file1FileItem.getName(); respons.getWriter()。print(name);
さまざまなブラウザを使用してテストすると、IE6はフルパスを返してファイルをアップロードします。 IE6が何をしているのかわかりません。これは私たちに多くのトラブルをもたらします。これは、この問題に対処することです。
また、この問題に対処することは非常に簡単です。それが完全なパスであるかどうかにかかわらず、私たちは最後の「/」の後にコンテンツをインターセプトするだけです
string name = file1FileItem.getName(); int lastIndex = name.lastIndexof( "//"); //最後の "/"の位置を取得します(lastindex!= -1){//フルパスではない場合、 "/"がないことに注意してください。 name = name.substring(lastindex + 1); //ファイル名を取得} response.getWriter()。print(name);3。中国の文字化けの問題
アップロードされたファイル名に中国語が含まれています。
アップロードされた名前に中国語が含まれている場合、エンコードを設定する必要があります。 Commons-Fileuploadコンポーネントは、エンコードを設定する2つの方法を提供します。
request.setcharacterencoding(string):この方法は私たちの最もよく知られている方法です。
fileupload.setheaderencdoing(string):この方法は前の方法よりも優先度が高い
アップロードされたファイルのファイルコンテンツには、中国語が含まれています。
通常、アップロードされたファイルをハードドライブに保存するため、ファイルのアップロードのコンテンツを気にする必要はありません。言い換えれば、ファイルはどのように見え、サーバーでどのように見えますか!
ただし、そのような要件があり、コンソールにアップロードされたファイルコンテンツを表示する必要がある場合は、fileItem.getString( "utf-8")を使用してエンコードを処理できます。
テキストファイルコンテンツと通常のフォームアイテムコンテンツの使用fileitemクラスのgetString( "utf-8")を使用して、エンコードを処理します。
4.同じ名前のファイルをアップロードする問題(ファイルの名前変更)
通常、ユーザーがアップロードしたファイルをアップロードディレクトリに保存しますが、ユーザーが同じ名前のファイルをアップロードした場合はどうなりますか?これにより、カバレッジが発生します。この問題に対処する方法は、UUIDを使用して一意の名前を生成し、「_」を使用してファイルによってアップロードされた元の名前を接続することです。
たとえば、ユーザーによってアップロードされたファイルは「私の1インチphoto.jpg」です。処理後、ファイル名は "891b3881395f4175b969256a3f7b6e10_my 1インチphoto.jpg"です。この方法では、ファイルが拡張機能を失うことはありません。 UUIDの独自性のため、アップロードされたファイルには同じ名前がありますが、サーバー側の同じ名前に問題はありません。
public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8"); DiskFileItemFactory dfif = new DiskFileItemFactory(); servletfileupload fileupload = new servletfileupload(dfif); {list <fileitem> list = fileupload.parserequest(request); // 2番目のフォームアイテムを取得します。最初のフォームアイテムはユーザー名であるため、2番目はファイル項目fileitem fileitem = list.get(1); string name = fileItem.getName(); //ファイル名を取得//クライアントがIE6を使用している場合、フルパスint lastindex = name.lastindexof( "//"); if(lastindex!= -1){name = name.substring(lastindex + 1); } //アップロードされたファイルSavePath = this.getServletContext()を取得します。GetRealPath( "/web-inf/uploads"); string uuid = commonutils.uuid(); // uuid string filename = uuid + "_" + name; //新しいファイル名はuuid + uuid + uscore + original name //ファイルオブジェクトを作成し、アップロードされたファイルはこのファイルによって指定されたパスに保存されます// savename file filenme/ // file item.write(file)を保存します。 } catch(Exception e){新しいservletexception(e); }}5.ディレクトリはあまりにも多くのファイルを保存できません(ディレクトリを保存して解散します)
ディレクトリに保存されているファイルが多すぎないはずです。一般に、1,000個のファイルがディレクトリに保存されます。多くのファイルがある場合、ディレクトリを開くときは非常に「クラッカー」になります。 c:/windows/system32ディレクトリを印刷することができます、あなたはそれを感じるでしょう
つまり、アップロードされたファイルを別のディレクトリに入れる必要があります。ただし、この方法はあまりにも多くのディレクトリにつながるため、アップロードされたファイルごとに1つのディレクトリを使用することはできません。したがって、アルゴリズムを使用して「分解」する必要があります!
日付を使用してそれを分割したり、毎日ディレクトリを生成するなど、それを分割する多くの方法があります。ファイル名の最初の文字を使用してディレクトリを生成することもできます。同じ初期文字のファイルが同じディレクトリに配置されます。
ブレイキングアルゴリズム:特定の日にアップロードされたファイルが多すぎると、ディレクトリファイルが多すぎます。
最初の文字を壊すためのアルゴリズム:ファイル名が中国語である場合、中国語が多すぎるため、ディレクトリが多すぎます。
ここでは、ハッシュアルゴリズムを使用して分割します。
ファイル名のハッシュコードを取得:int hcode = name.hashcode()
HCODEの4ビットを取得し、5〜8ビットのHCODEを取得して16進数文字に変換し、16進数文字に変換して、これら2つのヘキサデシマル文字を使用してディレクトリチェーンを生成します。たとえば、下部4ビット文字は「5」です
このアルゴリズムの利点は、Uploadsディレクトリに最大16のディレクトリが生成され、各ディレクトリ、つまり256のディレクトリで最大16のディレクトリが生成され、すべてのアップロードされたファイルがこれらの256ディレクトリに配置されることです。各ディレクトリの最大数が1000ファイルの場合、合計256,000ファイルを保存できます。
たとえば、アップロードファイル名は次のものです。新しいテキストdocument.txt。次に、「新しいテキストdocument.txt」のハッシュコードを取得し、ハッシュコードの下位4桁と5〜8桁を取得します。下の4ビットが9、および5〜8ビットが1の場合、ファイル保存パスはアップロード/9/1/
int hcode = name.hashcode(); //ファイル名のハッシュコードを取得します// hcodeの4ビットを取得し、16進文字列dir1 = integer.tohexstring(hcode&0xf); // hcodeの低い8〜8ビットを取得し、hexadecimal string(hexadecimal string)に変換します。 >>> 4&0xf); //ファイルの保存パスをフルパスに接続しますsavepath = savepath + "/" + dir1 + "/" + dir2; //
6。個々のアップロードされたファイルのサイズ制限
アップロードされたファイルのサイズを制限するのは非常に簡単です。ServleTFileuploadクラスのSetFilesizeMax(長い)だけです。パラメーターは、アップロードされたファイルのバイトの上限数です。たとえば、servletfileupload.setfilesizemax(1024*10)は、上限が10kbであることを意味します。
アップロードされたファイルが上限を超えると、fileuploadbase.filesizelimitex cheededexception例外がスローされます。この例外をサーブレットで取得し、「アップロードされたファイルが制限を超えて制限」をページに出力できます。
public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8"); DiskFileItemFactory dfif = new DiskFileItemFactory(); servletfileupload fileupload = new servletfileupload(dfif); //アップロードされた単一ファイルの上限を10kb fileupload.setfilesizemax(1024 * 10)に設定します。 {list <fileitem> list = fileupload.parserequest(request); // 2番目のフォームアイテムを取得します。最初のフォームアイテムはユーザー名であるため、2番目はファイルフォーム項目fileitem = list.get(1); string name = fileItem.getName(); //ファイル名を取得//クライアントがIE6を使用している場合、フルパスint lastindex = name.lastindexof( "//"); if(lastindex!= -1){name = name.substring(lastindex + 1); } //アップロードされたファイルSavePath = this.getServletContext()を取得します。GetRealPath( "/web-inf/uploads"); string uuid = commolutils.uuid(); // uuid string filename = uuid + "_" + name; //新しいファイル名はuuid + uuid + uscore + us + original name int hcode = name.hashcode(); //ファイル名のハッシュコードを取得しますinteger.tohexstring(hcode&0xf); // 5〜8ビットのhcodeを取得し、16進文字列文字列dir2 = integer.tohexstring(hcode >>>> 4&0xf)に変換します。 //ファイルをフルパスに保存パスを接続してくださいsavepath = savepath + "/" + dir1 + "/" + dir2; //このパスが存在しない可能性があるため、ファイルオブジェクトを作成し、ディレクトリチェーンを作成して、ファイルを保存する前にディレクトリが既に存在することを確認します(SavePath).mkdirs(); //ファイルオブジェクトを作成すると、アップロードされたファイルがこのファイルによって指定されたパスに保存されます// savepath、つまりアップロードされたファイルSave Directory // filename、filename、filename; // fileItem.write(file);を保存します。 } catch(Exception e){//スローされた例外のタイプがfileuploadbase.filesizelimitex cehtedexceptionであるかどうかを決定します。 if(e instanceof fileuploadbase.filesizelimitex cueededexception){//リクエストリクエストにエラーメッセージを保存します。setattribute( "msg"、 "upload failed!uploadedファイルは10kbを超えました!"); // index.jspページに転送! index.jspページでは、$ {msg}を使用してエラーメッセージrequest.getRequestDispatcher( "/index.jsp")を表示する必要があります。戻る; }新しいservletexception(e); }}7。ファイルのアップロードの合計サイズ制限
ファイルをアップロードするフォームでは、複数のファイルをアップロードできる場合があります。たとえば、
リクエストのサイズを制限する必要がある場合があります。つまり、このリクエストの最大バイト数(すべてのフォーム項目の合計)です!この関数の実装も非常に簡単です。 ServletFileuploadクラスのSetSizeMax(LONG)メソッドを呼び出すだけです。
たとえば、fileupload.setsizemax(1024 * 10);、要求全体の上限は10kbです。要求サイズが10kbを超えると、ServletFileuploadクラスのParsereQuest()メソッドは、fileuploadbase.sizelimitex ceededexceptionの例外をスローします。
8。キャッシュサイズと一時ディレクトリ
それについて考えてみてください。Blu-rayムービーをアップロードし、最初に映画をメモリに保存してから、メモリを介してサーバーハードディスクにコピーしてから、メモリを食べることができますか?
したがって、Fileuploadコンポーネントはすべてのファイルをメモリに保存することはできません。 Fileuploadは、ファイルサイズが10kbを超えるかどうかを判断します。その場合、ファイルをハードディスクに保存します。それを超えない場合は、メモリに保存します。
10kbはfileuploadのデフォルト値であり、設定できます。
ファイルがハードディスクに保存されると、Fileuploadはファイルをシステムの一時ディレクトリに保存します。もちろん、一時ディレクトリを設定することもできます
public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8"); DiskFileItemFactory DFIF = new DiskFileItemFactory(1024*20、new File( "f:// temp")); servletfileupload fileupload = new servletfileupload(dfif); {list <fileitem> list = fileupload.parserequest(request); fileitem fileitem = list.get(1);文字列名= fileItem.getName();文字列SavePath = this.getServletContext()。getRealPath( "/web-inf/uploads"); // fileItem.write(path(savepath、name));} catch(exception e){throw new servletexception(e);}} private file path(string save path、string filename){//フルパスlastindex = filename.lastindexof( "//"); if(lastindex!= -1); + 1)// File Nameを介して第2レベルのディレクトリを生成しますfile(SavePath).mkdirs();ファイルのダウンロード
1.サーブレットから1をダウンロードします
ダウンロードされたリソースは、Web-INFディレクトリに配置する必要があります(ユーザーがブラウザを介して直接アクセスできない限り)、サーブレットからダウンロードする必要があります。
JSPページのハイパーリンクを提供し、ダウンロードServletにリンクし、ダウンロードするファイル名を提供します。次に、DownloadServletはファイルの実際のパスを取得し、ファイルをRespons.getOutputStream()ストリームに書き込みます。
download.jsp
<body>これは私のJSPページです。 <br> <a href = "<c:url value = '/downloadservlet?path = a.avi' //>"> a.avi </a> <br/> <a href = "<c:url value = '/downloadservlet?path = a.jpg' ///>"> a.jpg </a> <br/> <a href = "url value = '/downloadservlet?path = a.txt' ////> "> a.txt </a> <br/> </body>
DownloadServlet.java
public void doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string filename = request.getParameter( "path"); string filepath = this.getServletContext()。getRealPath( "/web-inf/uploads/" + filename); file file = new file(filepath); if(!file.exists()){response.getWriter()。print( "ダウンロードするファイルは存在しません!");戻る; } ioutils.copy(new fileinputStream(file)、respons.getOutputStream());}上記のコードには次の問題があります。
1. A.AVIをダウンロードできますが、ダウンロードボックスのファイル名はダウンロードサーブレットです。
2。A.JPGとA.TXTをダウンロードすることはできませんが、ページに表示します。
2。サーブレットから2をダウンロードします
前の例の問題に対処しましょう。そうすれば、ダウンロードボックスに正しいファイル名を表示し、A.JPGおよびA.TXTファイルをダウンロードできるようにしましょう。
コンテンツ拡張ヘッダーを追加して、上記の問題を処理します。コンテンツディスポジションヘッダーが設定されると、ブラウザがダウンロードボックスをポップアップします
また、コンテンツディスポジションヘッダーを介してダウンロードしたファイルの名前を指定することもできます。
文字列filename = request.getParameter( "path"); string filepath = this.getServletContext()。getRealPath( "/web-inf/uploads/" + filename); file file = new file(filepath); if(!file.exists()){response.getWriter()。print( "ダウンロードするファイルは存在しません!");戻る; } response.AddHeader( "Content-Disposition"、 "attachment; filename =" + filename); ioutils.copy(new FileInputStream(file)、Response.getOutputStream());上記のコードは、TXTやJPGなどのファイルのダウンロードを既に処理し、ダウンロードボックスにファイル名を表示する問題を処理できますが、ダウンロードされたファイル名が中国語の場合、それでもできません
3.サーブレットから3をダウンロードします
以下は、ダウンロードボックスで中国語のディスプレイを処理する問題です!
実際、この質問は非常に簡単です。 URLを介して中国語をエンコードするだけです!
download.jsp
<a href = "<c:url value = '/downloadservlet?path =このキラーはcold.avi' //>"> href = "<c:url value = '/downloadservlet?path = description.txt'/>"> description.txt </a> <br/>
DownloadServlet.java
string filename = request.getParameter( "path"); // get requestでは、中国のパラメーターには中国語が含まれており、自分で変換する必要があります。 //もちろん、「グローバルエンコードフィルター」を使用する場合、ここでそれを処理する必要はありませんfilename = new String(fileName.getBytes( "ISO-8859-1")、 "utf-8"); string fileepath = this.getServletContext()。 file(filepath); if(!file.exists()){response.getWriter()。print( "ダウンロードするファイルは存在しません!"); return;} //すべてのブラウザはローカルエンコーディングを使用します。つまり、中国のオペレーティングシステムはこのファイル名を受信した後、GBK //を使用します。ISO-8859-1を使用してFilename = new String(filename.getBytes( "gbk")、 "gbk")、 "ISO-8859-1"); filename); ioutils.copy(new fileinputStream(file)、response.getOutputStream());上記はこの記事のすべての内容です。私はそれがすべての人の学習に役立つことを願っています、そして、私は誰もがwulin.comをもっとサポートすることを願っています。