Javawebでは、アップロードとダウンロードが一般的な機能です。ファイルのアップロードの場合、ブラウザはストリーミングプロセスでファイルをアップロードするプロセスでファイルをサーバーに渡します。一般に、Commons-Fileuploadパッケージは、アップロード機能を実装するために使用されます。 Commons-FileuploadはCommons-IOパッケージに依存するため、これら2つのパッケージをダウンロードする必要があります。
1.環境を構築します
Webプロジェクトを作成し、プロジェクトLibにパッケージをインポートする
2。ファイルアップロードを実装します
(アップロードの最初の方法)
新しいupload.jspページを作成します
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> < "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> upload file </title> <body> <プロジェクトへの絶対パス。つまり、プロジェクトを将来どこにコピーしても、正確なパス - > <form action = "<%= request.getContextPath()%>/uploadServlet" enctype = "multipart/form-data" method = "post"> <span> select file:</span <input = "ファイル</form> </body> </html>
ファイルのアップロードを処理する新しいサーブレットを作成します
パッケージcom.load; import java.io.file; import java.io.ioexception; import java.util.list; import javax.servlet.servletexception; import javax.servletexception; Import javax.servlet.annotation.webservlet; import javax.havelet.http.htptservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httservletresponse; Import org.apache.commons.fileupload.fileitem; Import org.apache.commons.fileupload.fileuploadexception; apache.commons.fileupload.disk.diskfileitemfactory; Import org.apache.commons.fileupload.servlet.servletfileupload; @webservlet( "/uploadservlet")public class uploadservlet {private long serialiversuid = 1l; public uploadServlet(){super(); } /* fileuploadパッケージでは、httpリクエストの複雑なフォーム要素がfileitemオブジェクトと見なされます。 * fileItemオブジェクトは、サーブレートファイルアップロードクラスのparserequest()メソッド(つまり、ラップされたhttpservletrequestオブジェクト)によって解析される必要があります。つまり、特定のテキストフォームとアップロードファイルは分離されています。 isMultiPartContent()メソッド:リクエスト内のファイルにリクエストがあるかどうかを分析します。 if(ismultipart){//設定可能なディスクノード工場diskfileitemactory factory = new DiskFileItemFactory(); //リクエストのコンテキスト情報を取得servletcontext servletcontext = request.getServletContext(); // Cache Directory、各サーバー固有のディレクトリファイルrepository =(file)servletcontext.getAttribute( "javax.servlet.context.tempdir"); //サーバーのCache Directory Factory.setRepository(リポジトリ)を設定します。 // servletfileuploadオブジェクトの作成は、fileitemfactoryに依存する必要があります//ファクトリーは、取得したアップロードファイルファイルタムオブジェクトをサーバーハードディスクに保存します。 servletfileupload upload = new servletfileupload(Factory); try {//ラップされた後にhttpservletrequestオブジェクトを解析します。これは、テキストフォームとアップロードファイル(httpリクエストがhttpservletrequestとして巻き付けられます)<fileitem> items = upload.parserequest(request); for(fileitem item:items){string fieldname = item.getFieldName();文字列filename = item.getName(); string contentType = item.getContentType(); boolean isinmemory = item.isinmemory(); long sizeinbytes = item.getSize(); //ファイルをインスタンス化する// request.getRealPath(リアルパスを取得)ファイル= newファイル(request.getRealPath( "/")+"/loads"+filename.substring(filename.lastindexof( "//")+1、filename.length()); item.write(file); }} catch(fileuploadexception e){e.printstacktrace(); } catch(Exception e){e.printstacktrace(); }}}保護されたvoid dopost(httpservletrequest request、httpservletResponse応答)Servletexception、ioexception {doget(request、response); }}(2番目のアップロード方法)
新しいJSPページを作成します(上記と同じ、パスだけが変更されます)
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> < "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> upload file </title> <body> <プロジェクトへの絶対パス。つまり、将来プロジェクトをコピーする場所に関係なく、正確なパス - > <form action = "<%= request.getContextPath()%>/uploadServlet1" enctype = "multipart/form-data" method = "post"> <span> select file:</span <input = "ファイル</form> </body> </html>
アップロードを処理するサーブレットを作成します
パッケージcom.load; import java.io.file; import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.inputStream; Import java.OutputStream; Import javax.servlet.servletexception; Import javax.servlet.annotation.Multipartconfig; javax.servlet.annotation.webservlet; import javax.servlet.http.httpsert; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse;インポートjavax.servlet.http.part; @webservlet( "/uploadservlet1")@multipartconfig(location = "")public class uploadservlet1 extends httpservlet {private static final long serialversionuid = 1l; public uploadservlet1(){super(); }保護されたvoid doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {respons.setcontenttype( "text/html; charset = utf-8"); request.setcharacterencoding( "utf-8"); //ファイルをアップロードしてファイルパーツ= request.getPart( "file1"); //ファイル名を受信する変数を定義します文字列filename = null; // content-disposition:ユーザーが要求されたコンテンツをファイルとして保存する場合にデフォルトのファイル名を提供することです//ファイル名を取得するif(content.trim()。startswith( "filename")){//ファイル名filename = content.substring(content.indexof( '=') + 1).trim()。除算= new fileoutputStream( "e:/loads" + filename) } system.out.println( "new file" + " +"/loads ");(アップロードの3番目の方法)
JSPSMartuploadパッケージは、ここでアップロードおよびダウンロードするために使用されます。著者は、この種のアップロードとダウンロードは比較的簡単だと考えていますが、多くの人はそれを使用せず、理解していないようです。
HTMLページを作成します
<!Doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> uploadファイル</itplode> </head> <body> <body> <body> <p> </p> <p> <p align = "center" enctype = "multipart/form-data"> <table align = "center"> <tr> <td> <div align = "center"> 1. <入力タイプ= "file1"> </div> </td> </tr <tr <tr <td> <td> <td> <div align = "center"> 2. <tr> <td> <div align = "center"> 3. <入力タイプ= "file" name = "file3"> </div> </td> </tr> <tr> <td> <div align = "center"> <inputタイプ= "submit" name = "submit" value = "upload him"> </div> </td> </</html </html>
ファイルをアップロードするためのサーブレットを作成します
パッケージcom.load; import java.io.io.ioexception; Import java.io.printwriter; Import javax.servlet.servletexception; import javax.servlet.annotation.websert; import javax.servlet.http.httpservlet; Import javax.http.httptservletrequest; javax.servlet.http.httpservletresponse; Import javax.servlet.jspfactory; Import javax.servlet.jsp.pageContext; import com.jspsmart.upload.file; import com.jspsmart.upload.smartupload; com.jspsmart.upload.smartuploadexception; @webservlet( "/douploadservlet")public class downloadservlet extends httpservlet {private static final long serialversionuid = 1l; public downloadServlet(){super(); }保護されたvoid doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {respons.setcontenttype( "text/html; charset = utf-8"); printwriter out = response.getWriter(); //新しいスマートアップロードオブジェクトSmartupload SU = new Smartupload()を作成します。 / * * pagecontext pagecontext; httpsessionセッション。 ServletContextアプリケーション。 servletconfig config; jspwriter out;オブジェクトページ= this; httpservletrequest要求、ページオブジェクト、リクエスト、応答がインスタンス化されているhttpservletResponse応答がインスタンス化されていますが、インスタンス化されていない他の5つのオブジェクトは、次の方法でインスタンス化されます。 */// JSP FactoryクラスPageContext PageContext = jspactory.getDefaultFactory()。getPageContext(this、request、response、null、8192、true)を介してコンテキスト環境を取得します。 // su.Initialize(pageContext)を初期化するアップロード; //ファイルをアップロードしてみてください{su.upload(); // fileを指定されたディレクトリにアップロードするint count = su.save( "/share"); out.println(count+"ファイルアップロードに正常に!<br>"+su.toString()); } catch(smartuploadexception e){e.printstacktrace(); } //ファイル情報を1つずつアップロードします(int i = 0; i <su.getfiles()。getCount(); i ++){file file = su.getfiles()。getFile(i); //(file.ismissing())継続する場合、ファイルが存在しない場合。 //現在のファイル情報を表示します。println( "<table border = 1>"); out.println( "<tr> <td> form item name(fieldname)</td> </td>"+file.getFieldName()+"</td> </tr>"); out.println( "<tr> <td>ファイル長</td> <td>"+file.getSize()+"</td> </tr>"); out.println( "<tr> <td> file name </td> <td>"+file.getFileName()+"</td> </tr>"); out.println( "<tr> <td> file name </td> <td>"+file.getFileName()+"</td> </tr>"); out.println( "<tr> <td> file拡張子</td> <td>"+file.getFileExt()+"</td> </tr>"); out.println( "<tr> <td>ファイル氏名</td> <td>"+file.getFilePathName()+"</td> </tr>"); out.println( "</table> <br>"); }} / ** * @see httpservlet#dopost(httpservletrequest request、httpservletResponse応答) * /保護されたvoid dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {// dodo aut-demerated method supeg(// }}注:code int count = su.save( "/share");最初にフォルダーを作成する必要があるため、最初にWebContentでそれを作成してから、プロジェクトをリプロイしてから再展開する必要があることを意味します。その後、フォルダーが実行側に作成されます。
または、実行するパスを直接見つけて共有フォルダーを作成することができます。
3.ファイルのダウンロードを実現します
(最初のファイルのダウンロード)
注:このコードは、サーブレットクラスに直接アクセスします
パッケージcom.load; import java.io.fileinputStream; Import java.io.ioexception; Import java.io.inputStream; Import java.io.outputStream; Import javax.servletexception; Import javax.servlet.annotation.webservlet; Import.havax.havellet.http.htpts javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; // http:// localhost:8080/test1/downloadをダウンロードして直接使用しますが、これには欠陥があります。ダウンロードファイル名に中国語がある場合、それは文字化けします! @webservlet( "/download")パブリッククラスのダウンロードhttpservlet {private static final long serialversionuid = 1l; public download(){super(); }保護されたvoid doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {respons.setcontenttype( "text/plain; charset = utf-8"); Response.setcharacterencoding( "utf-8"); Response.setheader( "location"、 "hisshin.txt"); Response.setheader( "content-disposition"、 "attachment; filename =" + "account.txt"); outputStream outputStream = respons.getOutputStream(); inputstream inputstream = new fileInputStream( "e:/loads"+"/account.txt"); byte [] buffer = new byte [1024]; int i = -1; while((i = inputstream.read(buffer))!= -1){outputstream.write(buffer、0、i); } outputStream.flush(); outputStream.close(); }保護されたvoid dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {doget(request、response); }}(2番目のダウンロード方法)
新しいJSPページを作成し、ダウンロードを選択します
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> < "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> href = "../ dodownloadservlet?filename = hehe.txt">クリックしてダウンロード</a> </body> </html>
ダウンロードするサーブレットクラスを作成します(注:このダウンロードのファイル名が中国語の場合でも、文字化けコードを引き起こします)
パッケージcom.load; import java.io.bufferedinputStream; Import java.io.file; Import java.io.fileinputStream; Import java.io.ioexception; Import java.io.OutputStream; Import java.OutputStream; Import Java.net.net. javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; import javax.servlet.servlet.http.httpservletResponse; Import javax.javellet.jspfactory; javax.servlet.jsp.pagecontext; Import org.hsqldb.lib.stringutil; Import com.jspsmart.upload.smartupload; Import com.jspsmart.upload.smartuploadexception;静的最終long serialversionuid = 1l; public dodownloadservlet(){super(); }保護されたvoid doget(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {//ダウンロードされたファイルの名前を取得// string filename = request.getParameter( "filename"); // string filename = new String(filename.getBytes( "iso8859-1")、 "utf-8"); //新しいsmartuploadオブジェクトを作成しましたsmartupload su = new smartupload(); pagecontext pagecontext = jspactory.getDefaultFactory()。getPageContext(this、request、response、null、true、8192、true); //初期化su.initialize(pagecontext)をアップロードします。 //ファイルの開くことを禁止するSu.setContentDisposition(null); //ファイルをダウンロードしてください{su.downloadfile( "/ristener/"+filename); } catch(smartuploadexception e){// dodo auto-enerated catch block e.printstacktrace(); }}保護されたvoid dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {doget(request、response); }}(ダウンロードの3番目の方法)
上記と同じJSPページコードは、ここで繰り返されません。
ダウンロード関数を実装する新しいSerlvetクラスを作成します(注:ファイル名が中国名であっても、文字化けの問題はありません!)
パッケージcom.load; import java.io.bufferedinputStream; Import java.io.file; Import java.io.fileinputStream; Import java.io.ioexception; Import java.io.OutputStream; Import java.OutputStream; Import Java.net.net. javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; import javax.servlet.servlet.http.httpservletResponse; Import javax.javellet.jspfactory; javax.servlet.jsp.pagecontext; Import org.hsqldb.lib.stringutil; Import com.jspsmart.upload.smartupload; Import com.jspsmart.upload.smartuploadexception;静的最終long serialversionuid = 1l; public dodownloadservlet(){super(); }保護されたvoid doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {// get file name string path1 = request.getParameter( "filename"); //パス名String path = request.getSession()。getServletContext()。getRealPath( "/ristener/"+path1); //パスは、ログパスとファイル名に基づいてスプライスされたファイルです。文字列filename = file.getName(); try {// IE11 BOOLEAN FLAG = request.GETHEADER( "user-agent")。indexof( "like gecko")> 0; // IE11ユーザーエージェント文字列:Mozilla/5.0(Windows NT 6.1; Wow64; Trident/7.0; RV:11.0)Gecko // IE6〜IE10バージョンユーザーエージェント文字列:Mozilla/5.0(互換性; MSIE 10.0; Windows NT 6.0; Trident/6.0) (request.getheader( "user-agent")。tolowercase()。indexof( "msie")> 0 || flag){filename = urlencoder.encode(filename、 "utf-8"); // ie browser} else {//最初にファイル名のスペースを削除し、そこに囲まれたフォームを削除します。 //このファイル名は、ブラウザのダウンロードボックスfilename = new String( "" "、" ").getBytes(" utf-8 ")、" ISO8859-1 ");に自動的に表示されるファイル名に使用されます。 // Firefox Browser // Firefoxブラウザーユーザーエージェント文字列://mozilla/5.0(Windows NT 6.1; Wow64; RV:36.0)Gecko/20100101 Firefox/36.0}入力ストリームFis = new BufferedinputStream(new FileInputStream(PATH));バイト[]バッファー; buffer = new byte [fis.abailable()]; fis.read(buffer); fis.close(); Response.reset(); Response.Addheader( "Content-Disposition"、 "attachment; filename =" +filename); Response.Addheader( "Content-Length"、 "" + file.length()); outputStream os = response.getOutputStream(); Response.setContentType( "Application/Octet-Stream"); os.write(buffer); //出力ファイルos.flush(); os.close(); } catch(ioexception e){e.printstacktrace(); } system.out.println(filename); }保護されたvoid dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {doget(request、response); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。