ファイルアップロード概要
Web開発におけるファイルアップロード機能を実現するには、次の2つの手順を完了する必要があります。
Webページにアップロード入力を追加します
サーブレットのアップロードされたファイルデータを読み、ローカルハードディスクに保存します。
入力アイテムをWebページに追加する方法は?
<input type = "file">タグを使用して、ファイルアップロード入力アイテムをWebページに追加します。ファイルアップロード入力項目を設定するときに注意する必要があります。
1.入力入力項目の名前属性を設定する必要があります。そうしないと、ブラウザはアップロードされたファイルデータを送信しません。
2。フォームのenctype値は、MultiPart/Form-Dataに設定する必要があります。この値を設定した後、ブラウザがファイルをアップロードすると、ファイルデータがHTTP要求メッセージ本文に添付され、MIMEプロトコルを使用してアップロードされたファイルを説明し、受信機を容易にしてアップロードされたデータを解析および処理します。
ファイルアップロード概要
ファイルのアップロードデータをサーブレットに読み取り、ローカルハードディスクに保存する方法は?
リクエストオブジェクトは、クライアントが送信したデータを読み取ることができるGetInputStreamメソッドを提供します。ただし、ユーザーは複数のファイルを同時にアップロードする可能性があるため、サーブレット側のアップロードデータをプログラムで直接読み取り、対応するファイルデータを個別に解析することは非常に厄介な仕事です。
ユーザーがファイルのアップロードデータを処理できるようにするために、Apacheオープンソース組織は、フォームのアップロードを処理するために使用されるオープンソースコンポーネント(commons-fileupload)を提供します。このコンポーネントは優れたパフォーマンスを備えており、APIは非常に簡単に使用でき、開発者はWebファイルのアップロード機能を簡単に実装できます。したがって、ファイルのアップロード関数は通常、Web開発に実装され、通常はCommons-Fileuploadコンポーネントを使用して実装されます。
Commons-Fileuploadコンポーネントを使用してファイルアップロードを実装すると、このコンポーネントの対応するサポートJARパッケージをインポートする必要があります:Commons-FileuploadおよびCommons-Ioが必要です。 Commons-Ioはファイルアップロードコンポーネント用の開発JARファイルに属していませんが、Commons-Fileuploadコンポーネントはバージョン1.1で始まり、機能するときにCommons-Ioパッケージからサポートが必要です。
fileuploadコンポーネントワークフロー
Core API -DiskFileItemFactory
DiskFileItemFactoryは、FileItemオブジェクトを作成する工場です。この工場クラスの一般的な方法:
public void setsizetheshhold(int syzethreshold):メモリバッファーのサイズを設定し、デフォルト値は10kです。アップロードファイルがバッファサイズよりも大きい場合、Fileuploadコンポーネントは一時ファイルキャッシュを使用してファイルをアップロードします。
public void setRepository(java.io.fileリポジトリ):一時ファイルディレクトリを指定します。デフォルト値はSystem.getProperty( "java.io.tmpdir")です。
public diskfileitemactory(int syzethreshold、java.io.fileリポジトリ):コンストラクター
Core API -servletfileupload
servletfileuploadは、アップロードされたファイルデータの処理を担当し、フォーム内の各入力アイテムをFileItemオブジェクトにカプセル化します。一般的な方法は次のとおりです。
boolean ismultipartcontent(httpservletrequestリクエスト):アップロードされたフォームがmultipart/form-dataタイプかどうかを判断します
リストParserequest(httpservletrequestリクエスト):リクエストオブジェクトを解析し、フォームの各入力アイテムをFileItemオブジェクトにラップし、すべてのfileItemsを保存するリストコレクションを返します。
setFilesizeMax(long filesizemax):アップロードされたファイルの最大値を設定します
SetSizeMax(Long SizeMax):アップロードされたファイルの総数の最大値を設定します
setheaderencoding(java.lang.stringエンコード):エンコード形式を設定します
SetProgressListener(ProgressListener Plistener)
ファイルアップロードケース
実装手順
1. DiskFileItemFactoryオブジェクトを作成し、バッファサイズと一時ファイルディレクトリを設定します2。ディスクファイレイテムエクトリーオブジェクトを使用して、ServletFileuploadオブジェクトを作成し、ファイルをアップロードするためのサイズ制限を設定します。
3。ServletFileupload.parserequestメソッドを呼び出して、リクエストオブジェクトを解析し、すべてのアップロードされたコンテンツを保存するリストオブジェクトを取得します。
4。リストを反復します。それぞれがfileItemオブジェクトを反復し、Isformfieldメソッドを呼び出して、アップロードされたファイルであるかどうかを判断します。
それは通常のフォームフィールドです。次に、getFieldNameを呼び出して、フィールド名とフィールド値を取得するためにメソッドを取得します
ファイルをアップロードするには、getInputStreamメソッドが呼び出され、データ入力ストリームを取得し、アップロードされたデータを読み取ります。
ファイルアップロードを実装するためのエンコード
ファイルのアップロードの詳細を処理します
中国のファイルが文字化けした問題
文字化けされた中国語のファイル名の問題は、servletuploaderのsetheaderencodingメソッドに電話するか、リクエストのセットチャージャーエンコードプロパティを設定することができます
一時的なファイル削除の問題
ファイルサイズは、diskfileitemfactory.setsizethResholdメソッドによって設定されたメモリバッファーのサイズを超えるため、Commons-fileuploadコンポーネントは一時ファイルを使用してアップロードされたデータを保存します。したがって、プログラムの最後に、fileitem.deleteメソッドを呼び出して、一時ファイルを削除してください。
削除メソッドへの呼び出しは、ストリームが閉じた後に行う必要があります。そうしないと、ファイルの使用が発生し、削除障害が発生します。
ファイルストレージの場所
サーバーのセキュリティを確保するには、アップロードされたファイルをアプリケーションのWeb-INFディレクトリ、またはWebサーバーによって管理されていないディレクトリに保存する必要があります。
複数のユーザーが同じファイル名でファイルをアップロードしてファイル上書きになるのを防ぐために、ファイルのアップロード装置にアップロードされたファイルに一意のファイル名があることを確認する必要があります。
単一のディレクトリ内のファイルが多すぎて、ファイルの読み取りと書き込みの速度に影響を与えるために、ファイルのアップロードを処理するプログラムは、可能なファイルアップロードの合計量に基づいて適切なディレクトリ構造生成アルゴリズムを選択し、散らばった方法でアップロードされたファイルを保存する必要があります。
ファイルのダウンロード
ダウンロードするファイルはさまざまなタイプである可能性があるため、ファイルはクライアントに転送する必要があり、対応するコンテンツはバイナリとして処理する必要があるため、ファイルコンテンツをクライアントに書き込むためにServeltOutputStreamオブジェクトを返すようにメソッドを呼び出す必要があります。
ケースをダウンロードしてください
アップロードディレクトリ内のすべてのファイルを反復し、ユーザーに表示し、ユーザーがダウンロードを完了することができます。
(特定のフォルダー内のすべてのファイルを読み取り、コレクションのリストに保存してから、リクエストの範囲に保存します)listfileservlt(すべてのファイルリストを表示)listfiles.jsp ---- downloaservlet.javaprivate string id; private string savename; //アップロードファイルの名前、ファイルプライベート文字列REALNAMEのUUID名。 //アップロードファイルプライベート文字列SavePathの本名。 //ファイルプライベートデートの稼働時間の場所を覚えておいてください。 //ファイルのアップロード時間プライベート文字列の説明。 //ファイルプライベート文字列ユーザー名の説明。 // uploader listfileservletpackage com.hbsi.servlet; import java.io.file; import java.io.ioexception; import java.io.io.printwriter; import java.util.hashmap; import java.util.map; import javax.servletexception; javax.servlet.http.httpservlet; importjavax.servlet.http.httpservletrequest; importjavax.servlet.servlet.httpservletResponse;パブリッククラスのリストファイルズマツAdentshttpservlet {publicvoid request(httpservleletreletretrestersedens)応答)throwsServleTexception、iOException {stringsavePath = this.getServletContext()。getRealPath( "/web-inf/upload"); mapmap = new hashmap(); listfiles(newfile(savepath)、 map); request.setattribute( "map"、map); request.getRequestDispatcher( "/listfile.jsp")。 // uuid_a_a_1_3_3.txtStringRealName = uuidname.substring(uuidname.indexof( "_") + 1); map.put(uuidname、realName);} doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {doGet(request,response);}}DownloadServletpackage com.hbsi.servlet;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class DownloadServlet extendshttpservlet {publicvoid doget(httpservletrequest request、httpservletresponse response)throwsservletexception、ioexception {stringfilename = request.getparameter( "filename"); filename = new String(fileName.getBytes( "ISO8889-1") "utf-8"); system.out.println(filename); stringsavepath = this.getFilesavePath(this.getRealName(filename)); filef = new file(save path + "//" + filename); if(!f.exists()){request.setattribute( "message"、 "存在 "); request.getRequestDispatcher("/message.jsp ") BYTE [1024]; intlen = 0; outputStreamout = respons.getOutputStream(); while((len = in.read(buf))> 0){out.write(buf、0、len);} in.close();} publicstring getFilesavepath(string filename){intdir1 = filename.hashcode( (filename.hashcode()>> 4)&0xf; stringsavepath = this.getServletContext()。getRealPath( "/web-inf/upload") + "//" + dir1 + "//" + dir2; returnsavepath;} publicString getRealName {stringRealName = StringRealName = StringRealName filename.substring(filename.indexof( "_") + 1); returnRealName;} publicVoid dopost(httpservletrequest request、httpservletresponse応答)throwsservletexception、ioexception {doget(request、response);}}}}