最近、プロジェクトにファイルをアップロードする必要があります。作業を完了した後、それを共有してメモを取ります。
アップロード関数はバックグラウンドとJavaに実装され、フロントエンドは主にJSのAjaxに実装されています。背景は、定期的に削除される一時ファイルを追加します。
効果は写真に示されているとおりです
まず第一に、アップロード関数のメインクラス、以下はコードです
パッケージutil.upload;インポートjava.io.file;インポートjava.io.ioexception;インポートjava.text.simpledateformat; Import java.util.date; import java.util.list; import java.util.uuid; Import.servletletelet.servax.servletletelet.servax.serveletelet.servax.servax.Servax.Servax.Servax.Servax.servax.servax.Servax.Servax.Servax.Servax。 javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; Import javax.servlet.servlet.httpservletResponse; Import javax.servlet.http.httpsession; Import.Commons.Commons.FilePload. org.apache.commons.fileupload.disk.diskfileitemfactory; Import org.apache.commons.fileupload.servlet.servletfileupload; public class uploadservlet {private static statserverversionuid = -31000284422237137137137137137137137137137137137137137137137137137137137137139L;プライベートブールイスアロー。プライベート文字列upfileName; //法律上の接尾辞名で配列を定義するprivate string [] adoverextname = new String [] {"zip"、 "rar"、// compress file "Txt"、 "doc"、 "wps"、 "docx"、 "java"、// text "xls"、 "xlsx"、// table "ppt"、// slide "pdf"、// play "f" jpg "、" bmp "、" gif "、" gif "、png" httpservletResponse応答)servletexception、ioexception {dopost(request、response);応答。「UTF-8」を取得し、アップロードします。 //アップロードされたファイルの最大値を設定します。これは、100MBを超えてはなりません= 100*1024*1024; servletfileupload upload = new servletfileupload(Factory); //リスナーをアップロードし、リスナーをuploadListenerリスナーを設定します= new uploadListener(); session.SetAttribute( "リスナー"、リスナー); upload.setProgressListener(リスナー); // path string path = request.getSession()。getServletContext()。getRealPath( "/upload"); string requestpath = request.getSession()。getServletContext()。getContextPath()+"/upload";ファイルdirfile = new file(path); //system.out.println(Request.getSession()。getServletContext()。getContextPath()); //フォルダーが存在しない場合、if(!dirfile .exists()&&!dirfile .isdirectory()){dirfile .mkdir(); } //日付に基づいてフォルダーを作成し、対応する日付date = new date()でフォルダーに保存します。 SimpleDateFormat sdf = new simpledateFormat( "yyyymmdd"); string subdirname = sdf.format(date); file subdirfile = new file(path+"/"+subdirname); if(!subdirfile .exists()&&!subdirfile .isdirectory()){subdirfile .mkdir(); } try {//アップロードリクエストリスト<fileitem> items = upload.parserequest(request); iterator <fileitem> itr = items.iterator(); while(itr.hasnext()){fileItem item =(fileItem)itr.next(); //それがファイルドメインであるかどうかを決定するif(!item.isformfield()){if(item.getName()!= null &&!item.getName()。文字列filename = item.getName(); //ファイルの接尾辞名文字列[] splitname = filename.split( "//。");文字列extname = splitname [splitname.length-1]; //ファイルの接尾辞名の[string aladpold:aotadextname){if(adolad.equalsignorecase(extname)){isallowed = true; }} if(!isallowed){error = "アップロードファイル形式は違法です!";壊す; } if(upfilesize> maxsize){error = "アップロードするファイルが大きすぎる、100MBを超えないファイルを選択してください!";壊す; } //この時点で、ファイルはサーバーのメモリに一時的に保存され、一時的なオブジェクトファイルtempfile = newファイル(makefileName(filename))を構築します。 //ファイルのディレクトリとファイル名を指定しますserver file = new file(path+"/"+subdirname+"/"、tempfile.getName()); item.write(file); //ファイルを作成する最初の方法はupfileName = requestpath+"/"+subdirname+"/"+tempfile.getName()です。 if(upfilename.equals( "")){error = "ファイルをアップロードするための選択なし!"; } system.out.println(upfileName); /*//入力ストリームのファイルを書き込む2番目の方法を作成します。 int length = 0; byte [] by = new byte [1024]; fileoutputStream fos = new fileoutputStream(file); while((length = is.read(by))!= -1){fos.write(by、0、length); //thread.sleep(10); } fos.close(); //thread.sleep(1000); */} else {error = "ファイルをアップロードするための選択はありません!"; }}}} catch(Exception e){e.printstacktrace();エラー= "ファイルをアップロードするときにエラーが発生しました:"+e.getMessage(); } if(!error.equals( "")){system.out.println(error); session.setattribute( "error"、error); } else {session.setattribute( "result"、 "ok"); session.setattribute( "filename"、upfileName); }} / ***ファイルの上書きを防ぐには、ファイルをアップロードするために一意のファイル名を生成する必要があります* @param filename元のファイル名* @return生成された一意のファイル名* / private string makefilename(string filename){return uuid.randomuid()。 }} Commons-Fileupload-1.3.1.jarとCommons-Io-2.4.jarを紹介する必要があります
アップロードプロセス中に、リアルタイムでアップロードするなどの情報を取得する必要があります。導入されたライブラリは、私たちのためにProgressListenerインターフェイスを追加しました。このインターフェイスを実装するために別のクラスを作成し、上記のクラスにこのインターフェイスを追加します。
//ファクトリオブジェクトを作成し、ファイルをファイルアップロードオブジェクトdiskFileItemFactory = new DiskFileItemFactory(); servletfileupload upload = new servletfileupload(Factory); //リスナーをアップロードし、リスナーをuploadListenerリスナーを設定します= new uploadListener(); session.SetAttribute( "リスナー"、リスナー); upload.setProgressListener(リスナー);
以下は、このリスニングクラスの特定の実装コードです
Package Util.upload; Import org.apache.commons.fileupload.progresslistener; public class uploadListenerはProgressListener {Private volatile long bytesRead = 0L、//アップロードされたバイトcontentlength = 0l、//合計項目数= 0l; public uploadListener(){super(); } @Override public void Update(long abytesread、long acontentlength、int anitem){bytesRead = abytesRead; contentlength = acontentlength; item = anitem; } public long getBytesRead(){return bytesRead; } public long getContentLength(){return ContentLength; } public long getItem(){return item; }}これで、アップロードの進行などの情報を取得できますが、フロントエンドに戻るためのサーブレットが必要です。次の実装
package util.upload;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.httpservletResponse; Import javax.servlet.http.httpsession; Import org.apache.commons.fileupload.progresslistener; Import com.google.gson.gson;/** get get road and upload and uploa httpservlet {private static final long serialversionuid = -3596466520775012991l;保護されたvoid doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {dopost(request、response); }保護されたvoid dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8"); Response.setcharacterencoding( "utf-8"); uploadListenerリスナー= null; httpsession session = request.getSession(); string error =(string)session.getattribute( "error"); string result =(string)session.getattribute( "result"); string filename =(string)session.getAttribute( "filename"); printwriter out = response.getWriter(); long bytesRead = 0、contentLength = 0; if(session!= null){ristener =(uploadListener)session.getAttribute( "リスナー"); if(ristener == null){return; } else {bytesRead = ristener.getBytesRead(); //アップロードされたバイトの数contentLength = ristener.getContentLength(); //合計バイト} //自分で定義されたリターン形式は、文字列rp = bytesread +"、" +contentlength +"、" +result +"、" +result +"、" +result +"、" +result +"、 //system.out.println(rp); out.print(rp); /* // json形式のデータマップ<string、object> map = new hashmap <string、object>(); map.put( "bytesread"、bytesread); map.put( "contentlength"、contentlength); map.put( "エラー"、エラー); map.put( "result"、result); map.put( "filename"、filename); gson gson = new gson(); string json = gson.tojson(map); out.print(json);*/ out.flush(); out.close(); }}}バックグラウンドにアップロードされた関数コードが記述されています。以下は、アップロードを実装するためのフロントエンドです。まず、HTML
< <a href = "javascript:addone()"> add </a> <div id = "ターゲット"> <入力タイプ= "file" file "name" file "onchange =" addfile(event) "bulthing/> </div> <span id =" test "> 0 </span> </body> </html> </html>
インターフェイスは比較的単純で、タグを追加するだけで、アップロードされた入力が隠されています。
CSSファイルメインレンダリングのアップロード進行の表示
#file {display:none; } .pro {width:500px; } .pborder {position:relative;幅:500px; /* width*/ border:1px solid#b1d632;パディング:1px; } .drawpro {width:0px;表示:ブロック;位置:相対;背景:#B1D632;色:#333333;高さ:20px; /* height*/ line-height:20px; /*テキストを垂直に中心にする前に、高さと一致する必要があります*/} .pspan {position:absolute;幅:500px;テキストアライグ:センター; font-weight:bold; }次は、フロントエンドフォーカス、JSファイルです
//アップロード情報を表示するhtmlvar upfile_htmlは '<divd div>' + '<span> 0%</span> </div> </div> <span name = "path"> </span> <img src = "common/upload/images/del.png" style = "float:light" del "del" del " TargetDiv_id = "Target"; //ファイルをアップロードするためのターゲットDIVのidvar httpxml = null; //アップロードリクエストvar httppRogress = null; // xmlhttprequestオブジェクトがxmlhttprequestオブジェクトを送信array(); //アップロードされたファイルのリストを保存var f_input; //ファイルvar flag = trueをアップロードする入力オブジェクトをアップロードしますvar flag = true; nowid = 0; // uploaded = 0; // queueの最後のファイルのidvar id file object*/function uploadfile(id、file){this.id = id; this.file = file; this.state = 0; this.path = "";}/***初期化方法*/window.onload = function init(){f_input = document.getElementbyId( "file"); var tdiv = document.getElementById(ターゲットDIV_ID); var oldspan = tdiv.getelementsbytagname( "span"); for(var i = 0; i <oldspan.length; i ++){oldfilelist.push(oldspan [i] .getattribute( "name")); }}/** *アップロードするファイルを選択 */function addone(){f_input.value = null; f_input.click();}/***ファイルを選択したら、ファイルオブジェクトをキューに追加してアップロードを起動**/function addfile(evt){var f = f_input.files [0]; if(f!= undefined){var uf = new uploadFile(id、f); uplist.push(uf); var div = document.createelement( "div"); div.setattribute( "id"、 "pro" +(id)); div.setattribute( "class"、 "pro"); div.innerhtml = upfile_html; var targetdiv = document.getElementById(targetdiv_id); TargetDiv.AppendChild(div); div.getElementsByTagname( "span")[1] .innerhtml = "ファイル名:" + uplist [id] .file.name; waittimer = setInterval( "upload()"、1000); ID ++; }}/*** queueにファイルをアップロードします*/function upload(){if(flag == true){if(uplist.length> 0){var uf; for(var i = 0; i <uplist.length; i ++){if(uplist [i] .state == 0){uf = uplist [i];アップリスト[i] .state = 1;壊す; }} if(uf!= undefined&uf!= null){flag = false; if(window.xmlhttprequest){httpup = new xmlhttprequest(); } else if(window.activexobject){httpup = new ActiveXObject( "microsoft.xmlhttp"); } var formdata = new formdata(); formdata.append( "file"、uf.file); httpup.open( "post"、uurl、true); httpup.upload.addeventlistener( 'progress'、uploadprogress、false); httpup.send(formdata); nowid = uf.id; Timer = setInterval( "getp()"、50); }}}}}/***アップロードプログレスなどの情報を取得*/function getp(){if(window.xmlhttprequest){httppRogress = new xmlhttprequest(); } else if(window.activexobject){httppRogress = new ActiveXObject( "microsoft.xmlhttp"); } httppRogress.onedeadystatechange = onProgress; httpprogress.open( "post"、gurl、true); httpprogress.setRequestHeader( "Content-Type"、 "Application/x-www-form-urlencoded"); httpprogress.send( "&timestamp =" +(new date())。getTime());}/***インターフェイスを処理し、それをインターフェイスに表示し、function onprogress(){if(httptrogress.readystate == 4 && httpprogress.status = = = httprogress.STATUS = = HTTPPROGRESTS.STATUS = = HTTPPROGRESTS.STATUS = = HTTPPROGRESTS.STATUS = = 200) var result = result.replace(/(^/s*)|(/s*$)/g、 ""); var res = result.split( "、"); var now = parseint(res [0]); var all = parseint(res [1]); var err = res [2]; var state = res [3]; var path = res [4]; var per =(now / all * 100).tofixed(2); var prodiv = document.getElementById( "pro" + nowid); if(prodiv!= null&prodiv!= undefined){if(err!= ""&err!= null&err.length> 0){window.clearinterval(タイマー); if(cancelflag == 1){err = "アップロード終端"; cancelflag = 0; } prodiv.getElementsByTagname( "div")[0] .style.display = "none"; Prodiv.getElementsByTagname( "span")[1] .innerhtml = err; httpup.abort(); flag = true;アップリスト[nowid] .state = 3;戻る; } if(state == "ok"){prodiv.getElementsByTagname( "div")[0] .style.display = "none"; var tmpf = uplist [nowid] .file; Prodiv.getElementsByTagname( "span")[1] .innerhtml = "ファイル名:" + tmpf.name; Window.ClearInterval(タイマー); flag = true;アップリスト[nowid] .state = 2;アップリスト[nowid] .path = path;戻る; } prodiv.getElementsByTagname( "div")[1] .style.width = per * 5 + "px"; Prodiv.getElementsByTagname( "span")[0] .innerhtml = per + "%"; }}}/***アップロードするメソッド*/function abortupload(obj){var idstr = obj.parentnode.id; var id = idstr.slice(3); if(uplist [id] .state == 1){httpup.abort(); flag = true; cancelflag = 1; } else {Uplist [id] .state = 3; } document.getElementById(idstr).remove();}/*** file* @returnsフォーマット文字列*/function getFileListstr(){var str = ""; if(oldfilelist.length> 0){for(var i = 0; i <oldfilelist.length; i ++){if(oldfilelist [i]!= null&oldfilelist [i]!= ""&oldfileList [i]!= undefined){str = str = str + oldfilerist [i] + " +" + " }}} for(var i = 0; i <uplist.length; i ++){var f = uplist [i]; if(f.state == 2){str = str + f.path + "、"; }} return str;}/***変更が既にあった古い添付ファイルを削除* OldFileList [num -1] = null; btn.parentnode.remove();} function uploadprogress(e){if(e.lengthcomputable){var ibytesuploaded = e.loaded; var ibytestotal = e.total; document.getElementById( "test")。innerhtml = ibytesuploaded+"/"+ibytestotal; }} Ajaxを使用してファイルをアップロードして、進行状況、結果、その他の情報をアップロードします。
使用されているHTML5ファイルAPIは、IE9以降が互換性がある必要があります。 Firefoxには問題があります。 Ajaxリクエストはすぐには返されません。すべてのAJAX要求が送信されるまで同じ結果が返され、その結果、アップロードの進行が表示されません。ただし、HTML5ファイルAPIを使用して取得することもできます。これには、小さなコードが追加されています。ページの下のテストDIVの値は、フロントエンドで取得された進行状況です。
アップロードされたすべてのファイルが実装されており、アップロードされた一時ファイルが処理されます。 UUIDという名前のファイルが使用されるため、多くのファイルが生成され、役に立たないファイルを定期的に処理する必要があります。 ServletContextListenerを使用してください:
サーブレットAPIには、ServletContextListenerインターフェイスがあり、実際にはWebアプリケーションのライフサイクルであるServletContextオブジェクトのライフサイクルを聞くことができます。
サーブレットコンテナがWebアプリケーションを起動または終了すると、ServletContextEnventイベントがトリガーされ、ServletContextListenerによって処理されます。 ServleTContextExteventイベントを処理するために、ServletContextListenerインターフェイスで2つの方法が定義されています。
その機能を使用して、一時ファイルを定期的に削除する機能が実現します。コードは次のとおりです。
package util.upload; Import java.io.ioexception; import java.io.inputStream; Import java.util.date; import java.util.properties; Import java.util.timer; Import java.util.timertask; Import Javax.servletext.servletextext.Servletext. javax.servlet.servletcontextListener;/ ** *タイムリスナー * * * */ public class tempfileLelistenerは、ServletContextListener {プライベートタイマータイマー; Private SystemTaskTest SystemTask; private static string every_time_run; static {properties prop = new Properties(); inputstream instrem = tempfilemanager.class.getClassLoader().getResourceAsStream( "tempfile.properties"); try {prop.load(instrem); System.out.println(instrem); every_time_run = prop.getProperty( "Every_time_run"); } catch(ioexception e){e.printstacktrace(); }最後に{try {trem.close(); } catch(ioexception e){e.printstacktrace(); }}} //リスナー初期メソッドpublic void contextInitialized(servletContextEvent SCCE){Timer = new Timer(); SystemTask = new SystemTaskTest(sce.getServletContext().getRealPath( "/")、sce.getServletContext()); try {System.out.println( "Timer Started"); //リスナーは、Webサイト文字列パス= scce.getServletContext()。getRealPath( "/");のルートディレクトリを取得します。 long time = long.parselong(every_time_run) * 1000; //ループ実行system.out.println( "time" + time); //最初のパラメーターは実行するコード、2番目のパラメーターは実行を開始するとき、3番目のパラメーターは実行中の頻度です。 Timer.schedule(SystemTask、10000、Time)の繰り返し実行; System.out.println( "タスクスケジュールが追加されました"); } catch(Exception e){e.printstacktrace(); }} public void contextDestroyed(servletcontextevent scal){try {timer.cancel(); } catch(Exception e){}}} / *** time tasker** / class systemtasktest extends timertask {private servletcontext Context;プライベートストリングパス。 public SystemTaskTest(String Path、ServletContext Context){this.path = path; this.context = context; } / *** runで定期的に実行されるタスクを配置* / public void run(){tempfilemanager etf; try {System.out.println( "タスクを開始!"); // system.out.println(new date()。tolocalestring())を実行するコードETF = new TempFileManager(PATH); etf.run(); system.out.println( "タスク実行が完了しました!"を指定してください! "); } catch(Exception e){e.printstacktrace(); }}}上記は単なるリスナーであり、一時ファイルを定期的に削除する方法を呼び出す責任があります。特定の実装は次のクラスです
パッケージutil.upload;インポートjava.io.file; import java.io.ioexception; Import java.io.inputstream; Import java.util.date; import java.util.properties;/***サーバーのファイルを削除****/public class tempfilemanager runnable {private string string path; "1440"; //ファイルストレージの時間は1日です{properties prop = new Properties(); inputstream instrem = tempfilemanager.class.getClassLoader().getResourceasStream( "execl.properties"); try {prop.load(instrem); retention_time = prop.getProperty( "file_retention_time"); } catch(ioexception e){e.printstacktrace(); }最後に{try {trem.close(); } catch(ioexception e){e.printstacktrace(); }}} /***コンストラクター。初期化パラメーター * @param Path */ public tempfilemanager(string path){this.path = path; } / ***スレッドがrun()* / public void run(){system.out.println( "ファイル管理Start ============================================================================================================= deletefiles(file) if(folder.delete()){system.out.println( "folder" + folder.getName() + "system.out.out.println(" folder " + folder.getname.getName() +" (int i = 0; i <files.length; i ++){if(files [i] .isdirectory()){files [i]);基準を満たすファイルを削除するif(candeletefile(file)){if(file.delete()){system.out.println( "file" + file.getName() + "delete justerfully!"); } else {system.out.println( "file" + file.getName() + "delete failed!このファイルが使用されている場合がある"); }} else {}} else {system.out.println( "削除するファイルなし"); }} catch(Exception e){system.out.println( "ファイルの削除failed ============"); e.printstacktrace(); }} / ***ファイルを削除できるかどうかを決定* / private boolean candeletefile(file file){date filedate = getFileDate(file);日付date = new date(); long time =(date.getTime()-filedate.getTime()) / 1000 /60 -integer.parseint(retention_time); //現在の時間とファイル間隔// System.out.println( "time =="+time)の間の議事録; if(time> 0){return true; } else {return false; }} / ** *ファイルの最後の変更時間を取得 * * @param file * @return * / private date getFileDate(file file){long modifiedtime = file.lastModified();日付d = new Date(ModifiedTime); d; }}ファイルがタイムアウトされているかどうかを判断し、タイミングを出した場合、フォルダーを自動的に削除できるかどうかを判断します。
上記はこの記事に関するものです。誰もがJavaプログラミングを学ぶことが役立つことを願っています。