Webファイルのアップロードは投稿を使用します。フォームの送信の投稿とは異なり、ファイルをアップロードするには、フォームのenctype属性をMultiPart/form-dataに設定する必要があります。アップロードされたファイルは比較的大きくなるため、このパラメーターは、ブラウザがバイナリアップロードを使用することを指定する必要があります。設定されていない場合、enctypeプロパティは、アプリケーション/x-www-form-urlencodedのデフォルトです。ブラウザを使用すると、ASCIIを使用してデータをサーバーに送信し、ファイルの送信に失敗します。
ファイルをアップロードするには、ファイルドメイン(<入力型= 'ファイル'/>を使用し、フォームのenctypeをMultiPart/Form-Dataに設定します。
クライアントのアップロードページは図に表示されます。
コードは次のとおりです。
upload.html
<!doctype html public " - // w3c // dtd html 4.01 transitional // en"> <html> <head> <title> upload file </title> <meta http-equiv = "keywords" content = "keyword1、keyword2、keyword3"> <meta http-equiv = <met " http-equiv = "content-type" content = "text/html; charset = utf-8"> <link rel = "styleSheet" type = "text/css" href = "css/style.css"> </head> <body> <form action = "" datipe "> <<<< align = "center"> <br/> <fieldset> <legend>アップロードファイル</legend> <br/> <div class = 'line'> <div align = 'left'> upload file 1 </div> <div align = 'left'> <入力タイプ= "ファイル"ファイル "name =" file1 "> </div> </div> <div> </div align = 'left'>ファイルのアップロード2 </div> <div align = 'left'> align = 'left'> <入力タイプ= "file" name2 "> </div> </div> <div class = 'line'> <div align = 'left' <div align = 'left'>アップロードファイル説明2 </div> <div align = 'left'> <入力タイプ= "text" name = "description2"> </div> </div> <div class = 'line'> <div align = 'left' </div> </div> </fieldset> </div> </form> </body> </html>
クライアントが実行するコードは非常にシンプルで、サーバーはより複雑です。内容を取得するには、ブラウザによって送信されたリクエストは、HTTPプロトコルで指定された形式に従って解析する必要があります。
バイナリストリームを解析する方が面倒です。多くのクラスライブラリはすでにこの作業を完了しています。たとえば、SmartuploadおよびApache Commons fileupload.smartuploadは商業クラスライブラリです。データは要求プロセスの解析中にメモリに保存されるため、より速くなりますが、大きなファイルをアップロードするとメモリオーバーフローが発生します。 Apache Commons Fileuploadは、無料でオープンソースのクラスライブラリです。 Strutsなどの一部のフレームワークは、Apache Common Fileuploadクラスライブラリを統合してファイルアップロードを実装しています。
図に示されているように:
コードは次のとおりです。
パッケージcom.helloweenvsfei.servlet; import java.io.file; import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.inputStream; Import java.io.outputStream; Import java.io.io.io.Printwriter; Import java.net.net.net.net.net.urlencoder; javax.servlet.servletexception; import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletresponse; Import org.apache.pilepload.diskfilead.diskfilead org.apache.commons.fileupload.fileitem; Import org.apache.commons.fileupload.fileuploadexception; public class uploadservlet {private static final long serialversionuid = 752302473721832088l; public void doget(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {respons.setcharacterencoding( "utf-8"); Response.getWriter()。println( "ファイルを投稿にアップロードしてください"); } @suppresswarnings( "un -checked")public void dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {file file1 = null、file2 = null;文字列description1 = null、description2 = null; Response.setcharacterencoding( "utf-8"); Response.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( "<link rel = 'styleSheet' type = 'text/css' href = '../css/style.css'>"); out.println( "<body>"); out.println( "<div align = center> <br/>"); out.println( "<fieldset style = 'width:90%'> <legend>アップロードファイル</legend> <br/>"); out.println( "<div class = 'line'>"); out.println( "<div align = 'left' class = 'leftdiv'>アップロードlog:</div>"); out.println( "<div align = 'left' class = 'rightdiv'>"); // diskfileuploadオブジェクトを使用して要求要求diskfileupload diskfileupload = new diskfileupload(); try {//解析結果をリストリスト<fileitem>リスト= diskfileupload.parserequest(request); out.println( "すべてのfileitems ... <br/>"); // fileItem fileitem:listのすべてのfileitemsをリストする:if(fileitem.isform()){//テキストフィールドの場合if( "descriptem.getfieldname()){// fileItem名が説明1 out.println(" description1 ... <br/> ");説明1 = new String(fileItem.getString()。getBytes()、 "utf-8"); } if( "description2" .equals(fileitem.getFieldName())){// fileItemがname is description2 out.println( "travel to description2 ... <br/>");説明2 = new String(fileItem.getString()。getBytes()、 "utf-8"); }} else {//それ以外の場合、ファイルフィールドの場合はif( "file1" .equals(fileitem.getFieldName())){//クライアントファイルパスファイルによってビルドされたファイルオブジェクトremotefile = new file(new String(fileItem.getName()。getBytes()、 "utf-8")); out.println( "file1 ... <br/>"への移動); out.println( "クライアントファイルの場所:" + remotefile.getabsolutepath() + "<br/>"); // server-sideファイル、アップロードフォルダーに配置file1 = new file(this.getServletContext()。getRealPath( "Attachment")、remotefile.getName()); file1.getParentFile()。mkdirs(); file1.createNewFile(); //ファイルを書き込み、fileItemのファイルコンテンツをファイルに入力streamに書き込みますins = fileItem.getInputStream(); outputStream ous = new fileoutputStream(file1); try {byte [] buffer = new byte [1024]; int len = 0; while((len = ins.read(buffer))> -1)ous.write(buffer、0、len); out.println( "file" + file1.getabsolutepath() + "<br/>"); }最後に{ous.close(); ins.close(); }} if( "file2" .equals(fileItem.getFieldName())){//クライアントファイルパスファイルremotefile = new file(new String(fileItem.getName()。getBytes()、 "utf-8")); out.println( "file2への旅行... <br/>"); out.println( "クライアントファイルの場所:" + remotefile.getabsolutepath() + "<br/>"); // server-sideファイル、アップロードフォルダーfile2 = new file(this.getServletContext()。getRealPath( "Attachment")、remotefile.getName()); file2.getParentFile()。mkdirs(); file2.createNewFile(); //ファイルを書き込み、fileitemのファイルの内容をファイルにinputstream ins = fileItem.getInputStream(); outputStream ous = new fileoutputStream(file2); try {byte [] buffer = new byte [1024]; int len = 0; while((len = ins.read(buffer))> -1)ous.write(buffer、0、len); out.println( "file" + file2.getabsolutepath() + "<br/>"); }最後に{ous.close(); ins.close(); }}}} out.println( "要求解析が完了した"); } catch(fileuploadexception e){// dodo auto-enerated catch block e.printstacktrace(); } out.println( "</div>"); out.println( "<div align = 'left' class = 'leftdiv'> file1:</div>"); out.println( "<div align = 'left' class = 'rightdiv'>"); out.println( "<a href = '" + request.getContextPath() + "/attachment/" + file1.getName() + "'ターゲット= _blank>" + file1.getName() + "</a>"); out.println( "</div>"); out.println( "</div>"); } if(file2!= null){out.println( "<div class = 'line'>"); out.println( "<div align = 'left' class = 'leftdiv'> file2:</div>"); out.println( "<div align = 'left' class = 'rightdiv'>"); out.println( "<a href = '" + request.getContextPath() + "/attachment/" + urlencoder.encode()、 "utf-8") + "'ターゲット= _blank>" + file2.getName() + "</a>"); out.println( "</div>"); out.println( "</div>"); } out.println( "<div class = 'line'>"); out.println( "<div align = 'left' class = 'leftdiv'>説明1:</div>"); out.println( "<div align = 'left' class = 'rightdiv'>"); out.println( "<div align = 'left' class = 'rightdiv'>"); out.println( "<div align = 'left' class = 'leftdiv'>説明2:</div>"); out.println( "<div align = 'left' class = 'rightdiv'>"); out.println(description2); out.println( "</div>"); out.println( "</div>"); out.println( "</fieldset> </div>"); out.println( "</body>"); out.println( "</html>"); out.flush(); out.close(); }}プログラムの操作効果を図に示します。
この記事は「Javaアップロード操作技術の要約」にまとめられており、誰もが学習して読むことを歓迎します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。