ファイルのアップロードとダウンロードは、開発中に非常に一般的です。簡単な要約は次のとおりです。
1。ファイルアップロードのために満たす必要がある条件:
a。 GETで送信されたデータが小さすぎるため、ページフォームのメソッドを投稿する必要があります
b。ページフォームのenctypeはMultiPart/Form-Dataタイプでなければなりません
c。フォームは、入力フィールドコードのアップロードの詳細を提供します。クライアントフォーム:<form enctype = "multipart/form-data"/>
(このプロパティが利用できない場合、サーバーによって読み取られるファイルパスはブラウザによって異なります)
サーバーservletinputStream is = request.getInputStream();さらなる分析のために、ストリームでリクエストボディのコンテンツを取得します。
2。ファイルのアップロードの詳細:
(1)フォームタイプを次のように設定する理由:MultiPart/Form-Data。キー=値ではないこのフォームで渡された値を設定することです。渡されるのはBytecodeです。
フォームとリクエストの間の対応:
上記のように、フォームタイプを次のように設定した後、MultiPart/Form-Dataに、選択したファイルは、Cookieの下のランダムな文字列の下の上の写真に示すように、HTTP要求本体のバイナリに初期化されていることがわかります。
ただし、ファイルバイトコードには、識別ファイル(つまり、ランダム文字列の文字列)、つまりコンテンツファイルヘッダーの最初の行と空白線の行で分割された2つの特別な行があることに注意してください。その後の3行目は、バイナリファイルコンテンツです。
したがって、サーバーがクライアントによってアップロードされたファイルを受け入れるとき、HTTP要求パラメーターでファイルバイナリを取得するとき、最初の3行を削除する必要があります。
3。アップロードされたTXTファイルを手動で解析します。
java.io.bufferedreader; Import java.io.ioexception; Import java.io.inputStream; Import java.io.inputStreamReader; Import java.io.io.printwriter; Import javax.servletexception; Import Javax.Servlet.http.httpservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse;/** *フォームのタイプがpostで、enctypeがMultipart/form-date *の場合、すべてのデータがバイナリモードでサーバーに渡されます。 *したがって、req.getParameter( "xxx")は常にnullです。 * req.getInputStream()を介してデータを取得し、テキストのデータを取得できます * * @author wangxi * */public class upservlet extends httpservlet {public void dopost(httpservletrequest req(httpservletresponse red)を投げます。 string txt = req.getParameter( "txt"); // returnはnull system.err.println( "txt is:"+txt); System.err.println( "=========================================================== inputstream in = req.getinputStream(); // byte [] b = new byte [1024]; // int len = 0; // inputStreamReader(in)); string firstline = br.readline(); //最初の行を読み取り、最初の行は区切られたシンボル、つまりランダムな文字列filename = br.readline(); //ファイル情報の2番目の行、filename = filename.substring(filename.lastindexof( "//")+1); // filename.lendline(); if.equals(firstline+"){break; 4. Apache-Fileuploadを使用して、ファイルのアップロードを処理します。
フレームワーク:ユーザーがしばしばコードで処理するビジネスをカプセル化することを指します。ユーザーが簡単に電話をかけることができます。
現在ファイルをアップロードしている(フレーム)コンポーネント:
apache - fileupload-
Orialiy cos 2008() -
JSP-Smart-upload 200m。
fileuploadを使用してファイルをアップロードします。
サードパーティパッケージのインポートが必要です。
apache-fileupload.jarファイルコアパッケージをアップロードします。
Apache-Commons-io.jarこのパッケージは、fileuploadの依存関係パッケージです。また、ツールキットです。
コアカテゴリ:
DiskFileItemFactoryは、ディスクスペースを設定し、一時ファイルを保存します。ただのクラス。
ServletFileUpload-リクエストと解析を受信するファイルアップロードのコアクラス。
servletfileupload.parserequest(requdest)-list <fileitem>
Note: A FileItem is the beginning of a logo: --------243243242342 To -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ステップ1:パッケージをインポートします:
ステップ2:ドポストメソッドを完成させるサーブレットを書く
/*** diskFileItemFactoryによって作成された2つのパラメーター*最初のパラメーター:SIZETHREADHOLD -CACHE(メモリ)に保存するデータのバイト(メモリ)を設定します。 *ファイルが10kを超える場合は、ファイルを最初に一時ディレクトリに保存する必要があります。 * 2番目のパラメーターファイルは、一時的なディレクトリの場所を指します * */public class up2servletはhttpservletを拡張します{public void dopost(httpservletrequest req、httpservletresponse resp)servletexception、ioexception {req.setcharacterencoding( "utf-8"); //プロジェクトのパスを取得ましたstring path = getservletcontext()。getRealPath( "/up"); //最初のステップでは、ディスクに一時ディレクトリを設定するために使用されるディスクファイレイテムエクトリーファクトリークラスを宣言します。 // 2番目のステップ:servletfileupoloadを宣言し、上記の一時的なディレクトリServletfileupload up = new servletfileupload(disk)を受信します。 // 3番目のステップ:parse request try {list <fileitem> list = up.parserequest(req); // 1つのfileitem file = list.get(0)のみの場合。 //パス文字列filename = file.getName()を使用してファイル名を取得します。 filename = filename.substring(filename.lastindexof( "//")+1); //ファイルタイプを取得するstring filetype = file.getContentType(); //ファイルのbytecode inputstream in = file.getInputStream()を取得します。 //出力バイトストリームOutputStreamを宣言= new FileOutputStream(path+"/"+filename); //ファイルコピーbyte [] b = new byte [1024]; int len = 0; while((len = in.read(b))!= -1){out.write(b、0、len); } out.close(); long size = file.getInputStream()。利用可能(); //アップロードされた一時ファイルfile.delete()を削除します。 // data resp.setContentType( "text/html; charset = utf-8"); printwriter op = resp.getwriter(); op.print( "ファイルアップロードされたファイル<br/>ファイル名:"+filename); op.print( "<br/>ファイルタイプ:"+filetype); op.print( "<br/>ファイルサイズ(バイト)"+サイズ); } catch(Exception e){e.printstacktrace(); }}}5.このフレームワークを使用して、複数のファイルをアップロードします。
ステップ1:ページの形式を複数の入力タイプに変更する= "ファイル"
<form action = "<c:url value = '/up3servlet' //>" method = "post" enctype = "multipart/form-data"> file1:<入力タイプ= "ファイル" name = "txt"> <br/> file2:<入力タイプ= "ファイル" name = "txt"> <br/> <入力タイプ= "
ステップ2:トラバースリスト
Public Class Up3Servletは、httpservlet {public void dopost(httpservletrequest request、httpservletresponse応答)を拡張します。 string path = getServletContext()。getRealPath( "/up"); //ディスクdisk diskfileitemactory disk = new DiskFileItemFactory(); disk.setsizethershold(1024*1024); disk.setrepository(new file( "d:/a")); //要求を解析するサーブレットを宣言しますservletfileupload up = new servletfileupload(disk); try {//リクエストリスト<fileitem> list = up.parserequest(request); //リストを宣言します<Map>アップロードされたファイルリストのデータをカプセル化しますfor(fileitem file:list){map <string、string> mm = new hashmap <string、string>(); //ファイル名を取得する文字列filename = file.getName(); filename = filename.substring(filename.lastindexof( "//")+1);文字列filetype = file.getContentType(); inputstream in = file.getInputStream(); int size = in.abailable(); //ツールクラスを使用fileutils.copyinputstreamtofile(in、new file(path+"/"+filename)); mm.put( "filename"、filename); mm.put( "filetype"、filetype); mm.put( "size"、 "+size); ups.add(mm); file.delete();} request.setattribute(" ups "、ups); // forward request.getRequestDispatcher("/jsps/show.jsp ")。上記は、ファイルをアップロードする一般的な方法です。それでは、Fileuploadの他の検索APIを見てみましょう。
fileItemがファイル(type = file)オブジェクトかテキスト(type =テキスト|チェックボックス|無線)であるかどうかを判断します。
Boolean isformfield()がテキストの場合|チェックボックス|ラジオ|選択、値はtrueです。
6。説明情報を含むプロセス写真
public class updescservletはhttpservlet {public void dopost(httpservletrequest request、httpservletresponse応答)を拡張します。 DiskFileItemFactory Disk = new DiskFileItemFactory(); disk.setrepository(new file( "d:/a")); try {servletfileupload up = new servletfileupload(disk); List <FileItem> list = up.parserequest(request); for(fileitem file:list){//ステップ1:それが通常のフォーム項目であるかどうかを決定するif(file.isformfield()){string filename = file.getFieldName(); // <入力型= "テキスト" name = "desc"> = desc string value = file.getString( "utf-8"); // } else {//ファイル文字列filename = file.getName();であることを示します。 filename = filename.substring(filename.lastindexof( "//")+1); file.write(new file(path+"/"+filename)); system.err.println( "ファイル名is:"+filename); system.err.println( "ファイルサイズは:"+file.getSize()); file.delete(); }}} catch(例外e){e.printstacktrace(); }}} 7.ファイルアップロードのパフォーマンスの向上
fileitemコレクションを取得するためにリクエストを解析するときは、以下を使用してください。
fileitemiterator it = up.getItemiterator(request);
使用と比較してください
List <FileItem> list = up.parserequest(request);
はるかに優れたパフォーマンス。
サンプルコード:
パブリッククラスのFastServletは、httpservletを拡張します{public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8"); string path = getServletContext()。getRealPath( "/up"); DiskFileItemFactory Disk = new DiskFileItemFactory(); disk.setrepository(new file( "d:/a")); try {servletfileupload up = new servletfileupload(disk); //以下はIteratorモードFileItemiterator IT = up.GetIteMiterator(request); while(it.hasnext()){fileitemstream item = it.next();文字列filename = item.getName(); filename = filename.substring(filename.lastindexof( "//")+1); inputstream in = item.openstream(); fileutils.copyinputstreamtofile(in、new file(path+"/"+filename)); }} catch(例外e){e.printstacktrace(); }}} 8。ファイルをダウンロードします
取得または投稿することができます。
public void dopost(httpservletrequest req、httpservletresponse rep)servletexception、ioexception {req.setcharacterencoding( "utf-8");文字列名= req.getParameter( "name"); //ステップ1:応答タイプRESP.SETCONTENTTYPE( "Application/Force-DownLoad")を設定します。 // 2番目の読み取りファイル文字列= getServletContext()。getRealPath( "/up/"+name); inputStream in = new fileInputStream(path); //応答ヘッダーの設定resp.setheader( "content-disposition"、 "attachment; filename ="+name); resp.setContentLength(in.abailable()); //ステップ3:ファイルを起動しますoutputStream out = resp.getOutputStream(); byte [] b = new byte [1024]; int len = 0; while((len = in.read(b))!= -1){out.write(b、0、len); } out.close(); in.close(); } J2EE人気フレームワークを使用する場合フレームワークの内部カプセル化を使用して、アップロードとダウンロードを完了する方が簡単です。
struts2がアップロードされます。
開発にStruts2を使用する場合、Commons-Fileupload-1.3.1.jarパッケージがインポートされたJARパッケージに存在することを見つけることは難しくありません。上記の学習を通じて、すでにそれを使用してファイルをアップロードおよびダウンロードできます。しかし、Struts2はさらにカプセル化を受けています。
ビュー
<form action = "fileupload.action" method = "post" enctype = "multipart/form-data"> username:<入力タイプ= "text =" username "> <br> file:<input type =" file "name ="> <br> <br> <inputタイプ= "value =" submit "> <
コントローラ
public class fileuploadactionはactionsupportを拡張します{private string username; //ファイルは、フロントエンドJSPによってアップロードされたファイル自体を参照していませんが、ファイルは一時フォルダーの下にプライベートファイルファイルを保存するためにアップロードされます。 //送信されたファイルの名前// strutsは、最後のファイルの名前を自動的に傍受し、このプロパティに挿入するprivate string filefileName。 // getterとsetterはこの時点で保存され、スペース@Override public String execute()スロー例外{// [ファイル]文字列へのパスを保存しますroot = servletactioncontext.getServletContext()。getRealPath( "/upload"); //一時的なファイル入力ストリーム入力inputStreamを取得= new FileInputStream(file); //出力ファイルoutputStream os = new fileoutputStream(new file(root、filefileName)); //アップロードされたファイルsystem.out.println( "filefileName:" + fileFileName)のファイル名を印刷します。 //ファイルは一時的なフォルダーに保存されているファイルであるため、ファイル名とファイルパスを印刷して、以前のfilefileName system.out.println( "file:" + file.getName())と同じかどうかを確認できます。 System.out.println( "file:" + file.getPath()); byte [] buffer = new byte [1024]; int length = 0; while(-1!=(length = is.read(buffer、0、buffer.length))){os.write(buffer); } os.close(); is.close();成功を返す; }}まず、ここのファイルがJSPによってアップロードされたファイルを実際に参照していないことを明確にする必要があります。ファイルがアップロードされると、Struts2はまずstruts.multipart.savedir(これはdefault.propertiesです)で指定されたストレージの場所を探します(デフォルトは空)。この一時的なストレージの場所を、プロジェクトのStruts2に指定できます。
<constant name = "struts.multipart.savedir" value = "/repository"/>
struts.multipart.savedirが設定されていない場合、javax.servlet.context.tempdirによって指定されたアドレスがデフォルトで使用されます。 javax.servlet.context.tempdirの値は、サーバーによって決定されます。たとえば、私のWebプロジェクトのコンテキストがABCであり、サーバーがTomcatを使用している場合、SavePathは%tomcat_home%/work/catalina/localhost/abc_である必要があります。一時ファイルの名前は、upload__1a156008_1373a8615dd__8000_00000001.tmpに似ています。一時的なファイル名は毎回異なる場合がありますが、おおよそこのスタイルです。また、Eclipseのサーバーを使用してTomcatを構成して開始する場合、上記のアドレスの%Tomcat_home%はシステムの実際のTomcatルートディレクトリではなく、Eclipseで指定されたアドレスになります。たとえば、私のローカルアドレスは次のとおりです。/home/wang/eclipsejavacode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload__1a156008_13737373a88815dd_80001.tmp.tmp.tmp
Struts2はダウンロードが完了しました。
Struts2ファイルをより簡単にダウンロードして、入力ストリームを定義し、ファイルを入力ストリームに書き込みます。キー構成は、まだstruts.xml構成ファイルで構成することです。
public class filededOwnLoadactionはactionSupportを拡張します{//サーバープライベート文字列パスでファイルをダウンロードするパス。 //プライベート文字列downloadFileNameをダウンロードするファイルのファイル名。 // write getter and setter public inputStream getDownLoadFile(){return servletactionContext.getServletContext()。 } @Override public string execute()スロー例外{//現在のアクションはsetdownloadfileName(xxx);成功を返す; }}アクションは、入力ストリームのダウンロードファイルを定義するだけで、ゲッターメソッドを提供します。次に、struts.xmlの構成ファイルを見てみましょう。
<アクションname = "filedownload"> <result name = "download" type = "stream"> <param name = "contentDisposition"> attachment; filename = "$ {downloadfileName}" </param> <param name = "inputname"> downloadfile </param> </result> </action>struts.xml構成ファイルに注意を払う必要がある場所がいくつかあります。まず、タイプはStream Type_として定義する必要があり、アクションにこれがファイルのダウンロードの結果であることを伝える必要があります。結果要素には一般に、パラマリックサブエレメントがあります。これは、ファイルをダウンロードするときにパラメーターを設定するために使用されます。 inputName属性は、アクション内のファイル入力ストリームを取得することです。名前は、アクションの入力ストリーム属性と同じでなければなりません。次に、ContentDisposition属性を使用します。この属性は、一般に、ダウンロードされたファイルの処理方法を指定するために使用されます。値が添付の場合、ダウンロードボックスがポップアップし、ユーザーがダウンロードするかどうかを選択できるようにします。この値が設定されていない場合、ブラウザは最初にダウンロードされたファイルを開くかどうかを確認します。可能であれば、ダウンロードされたファイルを直接開きます(もちろん、必要なものではありません)。別の値はファイル名です。これは、ダウンロード時にファイルによってプロンプトされたファイルのダウンロード名です。この情報を構成した後、ファイルのダウンロード機能を実装できます。
springmvcはアップロードを完了します:
ビューは、struts2の例とまったく同じです。これは書かれていません。
コントローラ:
@controller@requestmapping(value = "fileoperate")public class fileoperateAction {@requestmapping(value = "upload")public string upload(httpservletrequest request、@requestparam( "file")multipartfile photofile){//アップロードファイルdir = request.getSession()。getServletContext()。getRealPath( "/")+"upload"; //元のファイル名文字列filename = photofile.getoriginalfilename(); //ファイル拡張文字列extname = filename.substring(filename.lastindexof( "。"))を取得します。 //ファイル名の競合を防止し、名前をわずかに変更しますfilename = filename.substring(0、filename.lastindexof( "。")) + system.nanotime() + extname; fileutils.writebytearraytofile(new file(dir、filename)、photofile.getBytes()); 「成功」を返します。 }}SpringMVC完全なダウンロード:
@RequestMapping( "/download")public string download(string filename、httpservletrequest request、httpservletresponse response){respons.setcharacterencoding( "utf-8"); Response.setContentType( "MultiPart/form-data"); Response.setheader( "content-disposition"、 "attachment; filename =" + filename); try {inputstream inputstream = new fileInputStream(new file(fileのpath); outputStream os = response.getOutputStream(); byte [] b = new byte [2048]; int length; } catch(filenotStacktrace()} catch()}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。