ファイルのアップロードは、Webアプリケーションで非常に一般的です。インターネット上のJavaで開発されたファイルアップロードコンポーネントが多数あるため、JSP環境にファイルアップロード機能を実装するのは非常に簡単です。この記事では、JSPアプリケーションにファイルアップロード機能を追加する例として、Commons-Fileuploadコンポーネントを採用します。
Common-Fileuploadコンポーネントは、Apacheのオープンソースプロジェクトの1つであり、http://jakarta.apache.org/commons/fileupload/からダウンロードできます。
このコンポーネントを使用すると、一度に1つ以上のファイルをアップロードでき、ファイルサイズを制限できます。
ダウンロードした後、zipパッケージを解凍して、Commons-fileupload-1.0.jarをWebAppweb-inflibの下にTomcatのWebAppsにコピーします。ディレクトリが存在しない場合は、独自のディレクトリを作成してください。
新しいサーブレットを作成します:upload.java file upload:
java.io.*をインポートします。 Java.util。*をインポートします。 javax.servlet。*; javax.servlet.http。*をインポートします。 org.apache.commons.fileupload。*;パブリッククラスのアップロードhttpservlet {private string uploadpath = "c:upload"; //ファイルをアップロードするためのディレクトリprivate string temppath = "c:uploadtmp"; //一時ファイルディレクトリpublic void dopost(httpservletrequest request、httpservletresponse応答)ioexception、servletexception {}}DoPost()メソッドでは、サーブレットがブラウザによって発行されたPOSTリクエストを受信すると、ファイルのアップロードが実現されます。これがサンプルコードです:
public void dopost(httpservletrequest request、httpservletresponse応答)は、ioexception、servletexception {try {diskfileupload fu = new diskfileupload(); //最大ファイルサイズを設定します。ここに4MBFU.SetsizeMax(4194304)があります。 //バッファサイズを設定します。ここに4kbfu.setsizethreshold(4096)があります。 //一時ディレクトリを設定:fu.setrepositorypath(temppath); //すべてのファイルを取得する:list fileitems = fu.parserequest(request); iterator i = fileItems.iterator(); //各ファイルをシーケンスで処理します:while(i.hasnext()){fileitem fi =(fileitem)i.next(); //ファイル名を取得します。ファイル名にはパスが含まれます:string filename = fi.getName(); //ここでユーザーとファイル情報を記録できます// ... //ファイルに書き込み、暫定ファイル名はa.txt、ファイル名はfileName:fi.write(new File(uploadPath + "a.txt"))から抽出できます。 }} catch(例外e){//エラーページにジャンプできます}}構成ファイルの指定されたアップロードフォルダーを読みたい場合は、init()メソッドで実行できます。
public void init()throws servletexception {uploadpath = .... temppath = .... //フォルダーが存在しない場合、自動的に作成されます。 if(!new file(temppath).isdirectory())new file(temppath).mkdirs(); }サーブレットをコンパイルし、ClassPathを指定するように注意し、Commons-upload-1.0.jarとtomcatcommonlibservlet-api.jarを含めるようにしてください。
サーブレットを構成し、ノートパッドを使用してWebAppweb-infweb.xmlのTomcatwebappsを開き、そうでない場合は新しいものを作成します。
典型的な構成は次のとおりです。
<?xml version = "1.0" encoding = "iso-8859-1"?> < 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> <web-app> <servlet> <servlet-name> upload </servlet-name> <servlet-class> upload </s ervlet-class> <サーブレットマッピング<servlet-name> upload </servlet-name> <url-pattern>/fileupload </url-pattern </servlet-mapping </web-app <<<
サーブレットを構成した後、Tomcatを開始し、簡単なHTMLテストを書きます。
<form action = "fileupload" method = "post" enctype = "multipart/form-data" name = "form1">©input type = "file" file "=" file ">©input type =" submit "name =" submit "value =" upload "> </form>
Action = "fileupload" fileuploadは、サーブレットの構成時に指定されたURLパターンです。
これがエビのコードです:
このアップロードは、Smartuploadよりもはるかに使いやすいです。多くのバグがあるSmartuploadとは異なり、それは私によって完全に1つずつ作成されました。
呼び出し方法:
upload up = new upload(); up.init(request); /** SetSavedir(String Savedir)を呼び出すことができます。保存パスを設定し、setMaxFilesize(LONG SIZE)を呼び出して、アップロードされたファイルの最大バイトを設定します。 setagfileName(string)を呼び出して、アップロード後にファイルの名前を設定します(最初のファイルでのみ有効)*/up。 uploadfile();
次に、string [] names = up.getFileName();アップロードされたファイル名を取得します。ファイルの絶対パスは
保存されたディレクトリsavedir+"/"+names [i];
アップロードされたテキストまたはup.getParametervalues( "Fuled")をup.getParameter( "field")を介して取得できます。
複数のチェックボックスなど、同じ名前のフィールドの値を取得します。
自分で他の人を試してみてください。
ソースコードは次のとおりです。__________________________________________________________________
パッケージcom.inmsg.beans; java.io.*をインポートします。 Java.util。*をインポートします。 javax.servlet。*; javax.servlet.http。*をインポートします。 public class upload {private string savedir = "。"; //ファイルを保存するパスprivate string contentType = ""; //ドキュメントタイププライベート文字列charset = ""; //文字セットprivate arrayList tmpfileName = new ArrayList(); //ファイル名を保存するための一時的なデータ構造プライベートハッシュテーブルパラメーター= new Hashtable(); //パラメーター名と値を保存するデータ構造プライベートServletContextコンテキスト。 //プライベートhttpservletrequestリクエストの初期化に使用されるプログラムコンテキスト。 //リクエストに渡すために使用されるインスタンスオブジェクトプライベート文字列boundary = ""; //メモリデータセパレータープライベートイントレン= 0; //バイトの長さは、プライベートストリングクエリストリングのたびに内側から実際に読み取ります。プライベートインクカウント; //アップロードされたファイルの総数private string [] filename; //アップロードされたファイル名アレイプライベートlong maxfilesize = 1024 * 1024 * 10; //最大ファイルアップロードバイト。 private string tagfileName = ""; Public Final void init(httpservletrequest request)throws servletexception {this.request = request; boundary = request.getContentType()。サブストリング(30); // In-Memory Data Delimiter QueryString = Request.GetQueryString()を取得します。 } public string getParameter(String s){//指定されたフィールドのパラメーター値を取得するために使用されます。 } return(string)parameter.get(s); } public string [] getParametervalues(String s){//同じ名前のフィールドで指定されたパラメーター配列を取得するために使用されます。 if(parameter.isempty()){return null; }列挙e = parameter.keys(); while(e.hasmoreElements()){string key =(string)e.nextelement(); if(-1!= key.indexof(s + "||||||||||")|| key.equals(s)){al.add(parameter.get(key)); }} if(al.size()== 0){return null; } string [] value = new String [al.size()]; for(int i = 0; i <value.length; i ++){value [i] =(string)al.get(i); } return値; } public string getQueryString(){return querystring; } public int getCount(){return count; } public string [] getFileName(){return filename; } public void setMaxFilesize(long size){maxfilesize = size; } public void setagfileName(string filename){tagfileName = filename; } public void setSavedir(string savedir){//ファイルをアップロードするために保存するためにパスを設定します。savedir= savedir;ファイルtestdir = new file(savedir); //ディレクトリが存在することを確認するには、noがある場合は、(!testdir.exists()){testdir.mkdir(); }} public void setCharset(string charset){//文字を設定したthis.charset = charset; } public boolean uploadfile()throws servletexception、ioexception {//ユーザーsetCharset(request.getCharacterEncoding())によって呼び出されたメソッドアップロードメソッド; return uploadfile(request.getInputStream()); } private boolean uploadfile(servletinputStream servletinputStream)throws //中央ストレージデータservletexceptionを取得するメインメソッド、ioexception {string line = null; byte [] buffer = new byte [256]; while((line = readline(buffer、servletinputstream、charset))!= null){if(line.startswith( "content-disposition:form-data;"))){int i = line.indexof( "filename ="); if(i> = 0){// filename = in a delimiterの説明にある場合、それはファイル文字列fname = getFileName(line)のエンコードされたコンテンツであることを意味します。 if(fname.equals( "")){継続; } if(count == 0 && tagfilename.length()!= 0){string ext = fname.substring((fname.lastindexof( "。") + 1)); fname = tagfilename + "。" + ext; } tmpfilename.add(fname); count ++; while((line = readline(buffer、servletinputStream、charset))!= null){if(line.length()<= 2){break; }} file f = new file(savedir、fname); fileoutputStream dos = new fileoutputStream(f); long size = 0l; while((line = readline(buffer、servletinputstream、null))!= null){if(line.indexof(boundary)!= -1){break; } size += len; if(size> maxfilesize){throw new ioException( "ファイルが" + maxfilesize + "byte!"); } dos.write(buffer、0、len); } dos.close(); } else {//それ以外の場合は、文字列key = getKey(line);文字列値= ""; while((line = readline(buffer、servletinputStream、charset))!= null){if(line.length()<= 2){break; }} while((line = readline(buffer、servletinputstream、charset))!= null){if(line.indexof(boundary)!= -1){break; } value += line; } put(key、value.trim()、parameter); }}} if(queryString!= null){string []各= split(queryString、 "&"); for(int k = 0; k○equire.length; k ++){string [] nv = split(各[k]、 "="); if(nv.length == 2){put(nv [0]、nv [1]、parameter); }}} filename = new String [tmpfilename.size()]; for(int k = 0; k○filename.length; k ++){filename [k] =(string)tmpfilename.get(k); // arrayListの一時ファイル名をユーザーにデータに注ぎます} if(filename.length == 0){return false; //ファイル名データが空の場合、ファイルがアップロードされていないことを意味します} trueを返します。 } private void put(string key、string value、hashtable ht){if(!ht.containskey(key)){ht.put(key、value); } else {//同じ名前のキーが既にある場合は、現在のキーの名前を変更する必要があります。同時に、key {thread.currentthread()。sleep(1);と同じ名前を形成しないように注意してください。 //同じMSで2つの同一のキーを生成しないように} catch(例外e){} key += "|||||||||||" + system.currenttimemillis(); ht.put(key、value); }}/* servletinputStream.readline(byte [] b、int offset、length)メソッドを呼び出します。ラインに対応できるようにするために、バイト[] Bは256未満であってはなりません。書き換えられた読み取りラインでは、メンバー変数LENが実際のバイト数に呼び出されます(一部の行は256未満です)。ファイルコンテンツを書き込むとき、レン長のバイトは、バイトの全長ではなくバイト配列から書き込まれる必要があります。ただし、書き換えられたメソッドは文字列を返して実際のコンテンツを分析し、レンを返すことができないため、LENはメンバー変数として設定され、読み取り操作のたびに実際の長さを割り当てます。つまり、ファイルのコンテンツを処理する場合、データを文字列の形式で返して、開始マークとエンドマークを分析する必要があります。 */private string readline(byte [] linebyte、servletinputStream servletinputStream、string charset){try {len = servletinputStream.readline(linebyte、0、lienbyte.length); if(len == -1){return null; } if(charset == null){return new String(linebyte、0、len); } else {return new String(linebyte、0、len、charset); }} catch(例外_ex){return null; }} private string getFileName(string line){//ファイル名を説明文字列if(line == null){return ""; } int i = line.indexof( "filename ="); line = line.substring(i + 9).trim(); i = line.lastindexof( ""); if(i <0 || i> = line.length() - 1){i = line.lastindexof( "/"); if(line.equals( "" "")){return ""; } if(i <0 || i> = line.length() - 1){return line; }} return line.substring(i + 1、line.length() - 1); } private string getKey(string line){//フィールド名を説明文字列if(line == null){return ""; } int i = line.indexof( "name ="); line = line.substring(i + 5).trim(); return line.substring(1、line.length()-1); } public static string [] split(string strob、string mark){if(strob == null){return null; } stringtokenizer st = new StringTokenizer(STROB、MARK); arrayList tmp = new ArrayList(); while(St.HasmoreTokens()){tmp.add(St.NextToken()); } string [] strarr = new String [tmp.size()]; for(int i = 0; i <tmp.size(); i ++){strarr [i] =(string)tmp.get(i); } strarrを返します。 }}ダウンロードは実際には非常に簡単です。次のように処理する限り、問題は発生しません。 public void download(string filepath、httpservletresponse応答、boolean isonline)exception {file f = new file(filepath); if(!f.exists()){respons.senderror(404、 "ファイルが見つかりません!");戻る; } bufferedInputStream BR = new BufferedInputStream(new FileInputStream(f)); byte [] buf = new byte [1024]; int len = 0; Response.reset(); //(isonline){// Ononopenメソッドurl u = new url( "file:///"+filepath); Response.setContentType(U.OpenConnection()。getContentType()); Response.setheader( "content-disposition"、 "inline; filename ="+f.getName()); //ファイル名はutf-8}としてエンコードする必要があります} else {//純粋なダウンロードメソッドresponse.setContentType( "Application/X-MSDownLoad"); Response.setheader( "content-disposition"、 "attachment; filename =" + f.getName()); } outputStream out = respons.getOutputStream(); while((len = br.read(buf))ソン0)out.write(buf、0、len); br.close(); out.close(); }