この記事の例は、参照用のJavaファイルアップロードテクノロジーを共有しています。特定のコンテンツは次のとおりです
形状:
クライアントは、HTTPを送信するときに複合データ型を表すために、MultiPart/Form-Dataデータ型を使用する必要があります。今すぐ:
フォームでHTMLタグを使用します。
必要なパッケージ:
commons-fileupload.jar、コアアップロードファイルツールはこのパッケージにあります。
ファイルをアップロードするために必要なCommons-Io.jarパッケージ
ファイルクラスのアップロードの詳細な説明:
DiskFileItemFactory-キャッシュ領域サイズを指すタイムモニタリングファイルディレクトリを作成します
servletfileuploadは、httpservletrequestを解析するために使用されます。ファイルオブジェクトのセットを返します。
FileItemは、ユーザーによってアップロードされた各ファイルオブジェクトを表します。
<%@ページ言語= "java" import = "java.util。*" pageencoding = "utf-8"%> <!doctype html public " - // w3c // dtd html 4.01 transitional // en"ボード - 基礎となるレイヤー</font> <! - multipart/form-data:multipart(ファイルだけでなくパーツ) - > <form Action = "<%= request.getContextPath()%>/upload0" Method = "Post" Engctype = "MultiPart/Form-Data">ファイル<! - アップロードされたファイル名は中国語ではできません。それ以外の場合は、取得したファイル名はガーブルですが、次の例はこの問題を解決できます - > </form> <br/> <font color = "red" size = "6">ファイルアップロードを達成するにはapacheファイルアップロードツールを使用します</font> <! - application/x-x-x-x-ww-form-path = <> < method = "post" enctype = "multipart/form-data"> file:<入力タイプ= "file" name "/> <input type =" "value =" upload "/> </form color =" red "size =" 6 "> apacheファイルアップロードツールを使用してファイルアップロード2を達成します。 enctype = application/x-www-form-urlencoded(デフォルト値)</p> <p> post2(ファイルフォーム):enctype = multipart/form-data:multipart(ファイルだけでなくパーツ)</p> <form action = "<%= request.getContextPath() type = "file" name = "file"/> <! - post2(file form) - > <br/>ファイル説明:<入力タイプ= "テキスト" name = "desc"/> <! - post1(normal form) - > <br/> file 2:<入力タイプ= "ファイル" name = "file"/> <br/>ファイル説明2:<入力= ""/<1> 2:<入力タイプ= "ファイル" name = "file"/> <br/>ファイル説明2:<入力タイプ= "text" name = "desc"/> <input type = "balue =" upload "/> </form> <font color =" red "=" 6 "> apacheファイルアップロードツールを使用してファイルアップロード3(ファイルブレイクダウン)</font> < form):enctype = application/x-www-form-urlencoded(デフォルト値) - > <! - post2(uploadファイルフォーム):enctype = multipart/form-data:multipart(ファイルだけでなくパーツ) - > <form action = "<%= request.getContextPath() type = "file" name = "file"/> <! - post2(file form) - > <br/>ファイル説明:<入力タイプ= "テキスト" name = "desc"/> <! - post1(normal form) - > <br/> <br/>ファイル2:<入力タイプ= "ファイル" name = "ファイル"/> <br/>ファイル説明2:<入力タイプ= < value = "upload"/> </form> </body> </html>
遷移ボードの最下層を理解する
パッケージcn.hncu.servlet; Import java.io.bufferedReader; Import java.io.ioexception; Import java.io.inputStream; Import java.io.inputStreamReader; Import Java.io.PrintWriter; Import Javax.Servlet.Servletexception; Javax.Servletelet.Http.http.http.http. javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletResponse; public class upload0servletはhttpservlet {public void dopost(httpservletrequest request、httpservletresceptionsception) in = request.getInputStream(); BufferedReader br = new BufferedReader(new inputstreamReader(in));文字列線; while((line = br.readline())!= null){system.out.println(line); }}}Apacheファイルアップロードツールを使用して、ファイルアップロードを実装します
パッケージcn.hncu.servlet; Import java.io.file; import java.io.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletexception; Import Javax.htp.httpservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httservletresponse; Import org.apache.commons.fileupload.fileitem; Import org.apache.commons.fileupload.fileuploadexception; org.apache.commons.fileupload.disk.diskfileitemfactory; Import org.apache.commons.fileupload.servlet.servletfileupload; import org.apache.commons.io.fileutils; public class uploadservlet extends httpservlet {public void doegt( httpservletResponse応答)ServleTexception、ioException {respons.setContentType( "text/html"); printwriter out = response.getWriter(); out.println( "<!doctype html public/" - // w3c // dtd html 4.01 transitional // en/">"); out.println( "<html>"); out.println( "<head> <title> aサーブレット</title> </head>"); out.println( "<body>"); out.print( "はアップロードの取得をサポートしていません。。。。。"); out.println( "</body>"); out.println( "</html>"); out.flush(); out.close(); } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {//サーバーで、すべてのアップロードされたファイルのディレクトリを指定しますstring path = getServletContext()。 System.out.println( "path:"+path);ファイルdir = new file(path); if(!dir.exists()){dir.mkdirs(); } //ハードディスクベースの工場を作成する// DiskFileItemFactory Disk = new DiskFileItemFactory(); //一時ディレクトリを設定します(一時ディレクトリを設計することをお勧めします。そうしないと、システムの一時ディレクトリが使用されます。) // 3。データを書き込むためのバッファサイズをハードディスクディスクに設定します。 //ファイルがこの設定よりも大きい場合、一時ファイルが一時ディレクトリに形成されます//アップロードツール - ServletFileupload upload = new ServletFileupload(f)の解析用のオブジェクトを作成します。 upload.setfilesizemax(1024*1024*5); //最大アップロードされた単一ファイルを5mに設定します//アップロードされたファイルの最大サイズを設定します。複数のファイルの場合、最大8mのupload.setsizemax(1024*1024*8)までの複数のファイルの合計です。 //すべてのアップロードされたファイルサイズの合計を8mまで設定しますfor(fileitem fi:list){system.out.println( "file content type:"+fi.getContentType(); //ファイルコンテンツタイプ:Text/Plain System.out.println( "file name:"+fi.getName(); //ファイル名:c:/users/adl1/desktop/a.txt String ext = fi.getName()。substring(fi.getName()。lastIndexof( "。"));//。txtstring uuid = uuid.randomuid()。toString()。 string filename = uuid+ext; // fileutils.copyinputStreamTofile(fi.getinputStream()、new file( "d:/a/d/a.txt")); // write it dead // fi.getinputstream()は、実際のファイル情報fileutils.copyinputtream file(path+"/"+filename)); // itive avial}} catch(fileuploadexception e){e.printstacktrace(); }}}この場所にアップロードされたファイルを保存します
情報をアップロード:
結果のアップロード:
Apacheファイルアップロードツールを使用して、ファイルアップロード2を達成します(文字化けファイル名を解きます)
パッケージcn.hncu.servlet; Import java.io.file; import java.io.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletexception; Import Javax.htp.httpservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httservletresponse; Import org.apache.commons.fileupload.fileitem; Import org.apache.commons.fileupload.fileuploadexception; org.apache.commons.fileupload.disk.diskfileitemfactory; Import org.apache.commons.fileupload.servlet.servletfileupload; import org.apache.commons.io.fileutils; public class upload2servlet extends httpservlete(httpservlete) httpservletResponse応答)ServleTexception、ioException {respons.setContentType( "text/html"); //アップロードされたファイル(Post2)を含むフォームの場合、ドラマはアップロードされたファイルのファイル名にエンコードを設定することができます(中国の文字化けコードを解きます)//しかし、Post2モードPrintwriter out = Response.getWriter(); out.println( "<!doctype html public/" - // w3c // dtd html 4.01 transitional // en/">"); out.println( "<html>"); out.println( "<head> <title> aサーブレット</title> </head>"); out.println( "<body>"); out.print( "はアップロードの取得をサポートしていません。。。。。"); out.println( "</body>"); out.println( "</html>"); out.flush(); out.close(); } public void dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {// Step 1 //通常の形式(Post1)をスローすると、次の文は通常のフォームコンポーネントの内容のエンコードを設定できます(中国の第一語refarned問題を解くことができます)。 //アップロードされたファイル(Post2)を含むフォームの場合、この文はアップロードされたファイルのファイル名にエンコードを設定することができます(中国の文字化けコードを解きます)。ただし、通常のフォームコンポーネントの文字化けコードを解決することはできません(エンコードを設定できません)//サーバーで、すべてのアップロードされたファイルのディレクトリを指定しますstring path = getServletContext()。getRealPath( "/upload"); System.out.println( "path:"+path);ファイルdir = new file(path); if(!dir.exists()){dir.mkdirs(); } //一時ファイルバッファーサイズ - 8Kバッファー、一時ファイルアドレスDISKFILEITEMFACTORY F = new DiskFileItemFactory(1024*8、new File( "d:/a")); //ツールservletfileupload upload = new servletfileupload(f); upload.setfilesizemax(1024*1024*5); //最大アップロードされたシングルファイルを5m upload.setsizemax(1024*1024*8)に設定します。 //すべてのアップロードされたファイルサイズの合計を8mに設定しますfor(fileitem fi:list){if((fi.isformfield())){//通常のフォームコンポーネントの場合:チェックボックス、ラジオ、パスワード... // string desc = fi.getString(); System.out.println( "fi.getString():"+fi.getString()); // 2番目のステップ文字列desc = fi.getString( "utf-8"); //この文は、通常のフォームコンポーネントシステムのコンテンツエンコードを設定します。 } else {string ext = fi.getName()。substring(fi.getName()。lastIndexof( "。");//。txtstring uuid = uuid.randomuuid()。toString()。文字列filename = uuid+ext; //fi.getInputStream()は、実際のファイル情報fileutils.copyinputStreamTofile(fi.getinputStream()、new file(path+"/"+fileName)) }}}情報をアップロード:
結果のアップロード:
Apacheファイルアップロードツールを使用して、ファイルアップロード3(ファイルの内訳)を達成します
ハッシュディレクトリを使用してファイルストレージを最適化します。
ハッシュディレクトリは、ファイルストレージのパフォーマンスを最適化する方法です。 WindowsであろうとLinuxであろうと、NTFSであろうとExt3であろうと、各ディレクトリに収容できるアイテムの数は限られています。
保存できないということではありませんが、プロジェクトの数が大きすぎると、ファイルのインデックス速度が低下します。
したがって、ディレクトリに保存するファイルの数を計量する必要があります。節約しすぎるとパフォーマンスに影響しますが、節約しすぎると、ディレクトリが多すぎてスペースの無駄が生じます。したがって、ファイルの大きなバッチを保存するとき、
さまざまなサブディレクトリでファイルをより均等に「破損」できるアルゴリズムがあり、各レベルのインデックス速度を改善します。このアルゴリズムはハッシュです。一般的に使用されるMD5、SHA1などは、ハッシュディレクトリとして使用できます。 MD5はセッションでも使用されており、2レベルのハッシュパスを構成するSessionIDの1桁目と9桁目を取得します。つまり、システムはすべてのセッションファイルを16×16 = 256サブディレクトリに配布します。 Linuxの各ディレクトリに1000ファイルを保存できると仮定すると、最適なスペースパフォーマンス比を達成できるため、システムには256,000のセッションファイルが同時に使用されるのが理想的です。
パッケージcn.hncu.servlet; Import java.io.file; import java.io.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletexception; Import Javax.htp.httpservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httservletresponse; Import org.apache.commons.fileupload.fileitem; Import org.apache.commons.fileupload.fileuploadexception; org.apache.commons.fileupload.progresslistener; Import org.apache.commons.fileupload.disk.diskfileItemfactory; Import org.apache.commons.fileupload.servlet.servlet.servletfileupload; inmort.apach.commons.commons.commons.comcoms.comcomons.commons.comcomons.comcomons.commons.commons.commons.io.commons.commons.commons.commons.commons.commons.commons. httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)Servletexception、ioException {respons.setContentType( "text/html"); //アップロードされたファイル(Post2)を含むフォームの場合、ドラマはアップロードされたファイルのファイル名にエンコードを設定することができます(中国の文字化けコードを解きます)//しかし、Post2モードPrintwriter out = Response.getWriter(); out.println( "<!doctype html public/" - // w3c // dtd html 4.01 transitional // en/">"); out.println( "<html>"); out.println( "<head> <title> aサーブレット</title> </head>"); out.println( "<body>"); //「?」の後に部品を取得しますGETメソッドのURLの番号// http:// localhost:8080/servletdemo3/upload?name = jack&sex = male string qstr = request.getquerystring(); System.out.println( "QSTR:"+QSTR); // QSTR:name = jack&sex = male out.print( "suppood get upload。。。。。。。"); out.println( "</body>"); out.println( "</html>"); out.flush(); out.close(); } public void dopost(httpservletrequest request、httpservletResponse応答)throws servletexception、ioexception {respons.setContentType( "text/html; charset = utf-8"); printwriter out = response.getWriter(); // 1反黒:保護のフロントエンドは、post1メソッドを使用して送信されます//方法1 /*文字列型= request.getContentType(); if(!type.contains( "multipart/form-data")){out.println( "non-supported form submission");戻る; }*// method 2 boolean boo = servletfileupload.ismultipartcontent(request); if(!boo){out.println( "サポートされていないフォーム提出");戻る; } //ステップ1 //通常のフォームフォーム(POST1)、次の文では、通常のフォームコンポーネントのコンテンツのエンコードを設定できます(中国の文字化けの問題を解決できます)リクエスト。 //アップロードされたファイル(Post2)を含むフォームの場合、この文はアップロードされたファイルのファイル名にエンコードを設定することができます(中国の文字化けコードを解きます)。ただし、通常のフォームコンポーネントの文字化けコードを解決することはできません(エンコードを設定できません)//サーバーで、すべてのアップロードされたファイルのディレクトリを指定しますstring path = getServletContext()。getRealPath( "/upload"); System.out.println( "path:"+path);ファイルdir = new file(path); if(!dir.exists()){dir.mkdirs(); } //一時ファイルバッファーサイズ - 8Kバッファー、一時ファイルアドレスDISKFILEITEMFACTORY F = new DiskFileItemFactory(1024*8、new File( "d:/a")); //ツールservletfileupload upload = new servletfileupload(f); upload.setfilesizemax(1024*1024*5); //最大アップロードされたシングルファイルを5m upload.setsizemax(1024*1024*8)に設定します。 //すべてのアップロードされたファイルサイズの最大合計が8m //▲4アップロード進行を聞きますupload.setProgressListener(){private double pre = 0d; @override //パラメーター1:アップロードされたパラメーター2:いくつのバイトがパラメーター2:バイト数が長い。 PCONTENTLENGS、INT PITEMS){double d = 1.0*100; //解析ツールを使用してtry {list <fileitem> list = upload.parserequest(request); for(fileitem fi:list){if((fi.isformfield())){//通常のフォームコンポーネントの場合:チェックボックス、ラジオ、パスワード... // string desc = fi.getString(); System.out.println( "fi.getString():"+fi.getString()); // 2番目のステップ文字列desc = fi.getString( "utf-8"); //この文は、通常のフォームコンポーネントSystem.out.println( "エンコード:"+desc)のコンテンツエンコードを設定します。 } else {// Protect:選択していないif(fi.getsize()<= 0){continue; //次のファイルを読み取り} system.out.println( "+fi.getContentType(); //ファイルコンテンツタイプ:テキスト/プレーン系。 c:/users/adl1/desktop/a.txt string string ext = fi.getname()。substring(fi.getName()。lastIndexof( "。"); //。txt string uuid = uuid.randomuid()。toString()。文字列filename = uuid+ext; //ファイルディレクトリブレイクテクノロジー文字列dir1 = integer.tohexstring(uuid.hashcode()&0x0f); string dir2 = integer.tohexstring((uuid.hashcode()&0xf0)>> 4); //fi.getInputStream()は、実際のファイル情報fileutils.copyinputStreamTofile(fi.getinputStream()、new file(path+"/"+dir1+"/"+dir2+"/"+filename); // cuttincection e)}}}}}}}}} }}}メッセージを破る:
結果を破る:
ファイル1:
ファイル2:
アップロードの進行の原則を示します
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。