Webアプリケーションシステムの開発では、ファイルアップロードおよびダウンロード関数は非常に一般的に使用されています。今日は、Javawebでファイルアップロードとダウンロード機能の実装について話しましょう。
1。簡単な例をアップロードします
jsp
<%@ page Language = "Java" Import = "Java.util。*" PageEncoding = "UTF-8"%> <!doctype HTML public " - // w3c // dtd xhtml 1.0 transitional // en" /> <title> file upload and download < /title> < /head> < /head> <body> <form action = "$ {pagecontext.request.contextpath} /uploadservlet" enctype = "multipart /form-data" method = "post"> uploadユーザー:<入力タイプ= "テキスト"ファイル "ファイル="ファイル<br /> upload file 2:<入力タイプ= "file" name = "file2" /> <br /> <input type = "value =" upload " /> < /form> <br /> $ {requestscope.message} < /body> < /html> < /html>サーブレット
public void doget(httpservletrequest request、httpservletResponse応答)ServleTexception、ioException {try {// 1。 Parser Factory DiskFileItemFactory = new DiskFileItemFactory()を取得します。 // 2。 Parser ServletFileupload upload = new ServletFileupload(Factory)を取得します。 // 3。アップロードフォームのタイプを決定するif(!upload.ismultipartContent(request)){//フォームのアップロードは通常のフォームで、従来の方法でデータを取得して戻ります。 } //フォームをアップロードするには、パーサーが呼び出され、upload data list <fileitem> list = upload.parserequest(request); // fileItem //リストを透明にして、最初のアップロードitem item data fileitemオブジェクトを取得します(fileitem item:list){if(item.isformfield()){//取得したのは通常の入力項目文字列name = item.getFieldName(); //入力項目の名前を取得しますstring value = item.getString(); System.out.println(name + "=" + value); } else {//アップロード入力項目文字列filename = item.getName(); //アップロードされたファイル名c:/documents and settings/thinkpad/desktop/1.txt filename = filename.substring(filename.lastindexof( "//")+1); inputstream in = item.getInputStream(); //アップロードされたデータint len = 0;バイトバッファー[] = new byte [1024]; //アップロードされたファイルを保存するために使用されるディレクトリは、外の世界に文字列savepath = this.getServletContext()。getRealPath( "/web-inf/upload"); System.out.println(SavePath); fileoutputStream out = new FileOutputStream(SavePath + "/" + filename); // fileをuploadディレクトリに書き込みますhired((len = in.read(buffer))> 0){out.write(buffer、0、len); } in.close(); out.close(); request.setattribute( "message"、 "upload success"); }}}} catch(例外e){request.setattribute( "message"、 "upload failed"); e.printstacktrace(); }}2。アップロード機能の変更:
注:
1。ファイル名をアップロードするための中国語の文字
upload.setheaderencoding( "utf-8"); //ファイル名をアップロードするための中国の文字化けコードを解きます
//フォームはファイルにアップロードされ、リクエストエンコードは無効で、手動でのみ変換できます
1.1 value = new String(value.getBytes( "ISO8859-1")、 "utf-8");
1.2文字列値= item.getString( "utf-8");
2。サーバーのセキュリティを確保するには、ファイルをアップロードするディレクトリに配置する必要があります。これは、外の世界で直接アクセスできないものです。
3.ファイルの上書きを防ぐには、ファイルをアップロードするために一意のファイル名を生成する必要があります。
4.ディレクトリの下にあまりにも多くのファイルが表示されないようにするには、ハッシュアルゴリズムを使用してストレージを分割する必要があります。
5.アップロードされたファイルの最大値を制限するには、次のことを使用できます。ServleTFileupload.setFilesizeMax(1024)メソッドとキャプチャ:
fileuploadbase.filesizelimitex cueededexception例外を使用して、ユーザーフレンドリーなプロンプトを提供します
6.一時ファイルが削除されていることを確認する場合は、アップロードファイルを処理した後、item.deleteメソッドを呼び出す必要があります。
7.アップロードされたファイルのタイプを制限するには、アップロードされたファイル名を受信するときに、接尾辞名が合法かどうかを判断します。
8。ファイルアップロードの進捗状況を聞いてください:
servletfileupload upload = new servletfileupload(Factory); upload.setProgressListener(new ProgressListener(){public void update(long pbytesread、long pcontentlength、int arg2){system.out.println( "ファイルサイズは:" + pcontentlength + "、現在処理されています:" + pbytesRead);}}); 9.ファイルアップロード入力アイテムをWebページに動的に追加
function addinput(){var div = document.getElementById( "file"); var input = document.createelement( "input"); input.type = "file"; input.name = "filename"; var del = document.createelement( "input"); del.type = "button"; del.Value = "Delete"; del.onclick = function d(){this.parentnode.parentnode.removechild(this.parentnode); } var innerdiv = document.createelement( "div"); innerdiv.appendChild(input); innerdiv.appendChild(del); Div.AppendChild(InnerDiv); }JSPをアップロード:
<%@ page Language = "Java" Import = "Java.util。*" PageEncoding = "UTF-8"%> <!doctype HTML public " - // w3c // dtd HTML 4.01 Transitional // en" addInput(){var div = document.getElementById( "file"); var input = document.createelement( "input"); input.type = "file"; input.name = "filename"; var del = document.createelement( "input"); del.type = "button"; del.Value = "Delete"; del.onclick = function d(){this.parentnode.parentnode.removechild(this.parentnode); } var innerdiv = document.createelement( "div"); innerdiv.appendChild(input); innerdiv.appendChild(del); Div.AppendChild(InnerDiv); } </script> </head> <body> <form action = "" enctype = "mutlipart/form-data"> </form> <table> <table> <tr> <td>ユーザー:</td> <td> <入力タイプ= "text" name "name =" username "> </td> </td </td </td </td </td </td> <td> <td> file "onclick =" addinput() "> </td> </tr> <tr> <td> </td> <td> <div id =" file "> </div> </td> </td> </tr </table> </body> </html>サーブレットをアップロードします
public class uploadServlet1は、httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {//request.getParameter("uusername ")を拡張します。 // ****エラーrequest.setcharacterencoding( "utf-8"); //フォームがファイルにアップロードされ、リクエストエンコードが無効です//アップロードされたファイルsavepath = this.getServletContext()。getRealPath( "/web-inf/upload"); try {diskFileItemFactory Factory = new DiskFileItemFactory(); Factory.setRepository(新しいファイル(this.getServletContext()。getRealPath( "/web-inf/temp"))); servletfileupload upload = new servletfileupload(Factory); /* upload.setProgressListener(New ProgressListener(){public void update(long pbytesread、long pcontentlength、int arg2){system.out.println( "ファイルサイズは:" + pcontentlength + "、現在処理されています:" + pbytesread);}); //ファイル名をアップロードする中国の文字化けコードを解くif(!upload.ismultipartContent(request)){//従来の方法でデータを取得します。 } /* upload.setfilesizemax(1024); upload.setsizemax(1024*10);*/ list <fileitem> list = upload.parserequest(request); for(fileItem item:list){if(item.isformfield()){//通常の入力項目のデータは、fileitem string name = item.getFieldName()にカプセル化されています。 string value = item.getString( "utf-8"); // value = new String(value.getBytes( "ISO8859-1")、 "utf-8"); System.out.println(name + "=" + value); } else {//アップロードファイルは、fileitem文字列filename = item.getName();にカプセル化されています。 //異なるブラウザによって送信されたファイルは異なるc:/a/b/1.txt 1.txt system.out.println(filename); if(filename == null || filename.trim()。equals( "")){continue; } filename = filename.substring(filename.lastindexof( "//")+1); inputstream in = item.getInputStream();文字列savefileName = makefileName(filename); //ファイルの名前を取得しますstring realsavepath = makepath(savefilename、savepath); //ファイルを取得するディレクトリを保存fileoutputStream out = new fileoutputStream(realSavePath + "//" + savefileName);バイトバッファー[] = new byte [1024]; int len = 0; while((len = in.read(buffer))> 0){out.write(buffer、0、len); } in.close(); out.close(); item.delete(); //一時的なファイルを削除}}} catch(fileuploadbase.filesizelimitex ceehryedexception e){e.printstacktrace(); request.setattribute( "message"、 "ファイルは最大値を超えています!!!"); request.getRequestDispatcher( "/message.jsp")。戻る; } catch(Exception e){e.printstacktrace(); }} public string makefileName(string filename){//2.jpg return uuid.randomuid()。toString() + "_" + filename; } public string makepath(string filename、string savepath){int hashcode = filename.hashcode(); int dir1 = hashcode&0xf; // 0-15 int dir2 =(hashcode&0xf0)>> 4; // 0-15文字列dir = savepath + "//" + dir1 + "//" + dir2; //アップロード/2/3アップロード/3/5ファイル= new File(dir); if(!file.exists()){file.mkdirs(); } return dir; } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}3。機能をダウンロードします
// Webサイト上のすべてのダウンロードファイルのすべてのファイルパブリッククラスリストファイルサーブレット拡張httpservlet {public void doget(httpservletrequest request、httpservletResponse応答)スローservletexception、ioexception {string filepath = this.getservletcontext()。マップマップ= new Hashmap(); listFile(new File(filepath)、Map); request.setattribute( "Map"、Map); request.getRequestDispatcher( "/listfile.jsp")。 } public void listfile(file file、map map){if(!file.isfile()){file files [] = file.listfiles(); for(file f:files){listfile(f、map); }} else {string realname = file.getName()。substring(file.getName()。indexof( "_")+1); //9349249849-88343-8344_a_fan_davi.avi map.put(file.getName()、realName); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}JSPディスプレイ
<%@ページ言語= "java" import = "java.util。*" pageencoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%> < Transitional // en "> <html> <head> <title>私のjsp 'listfile.jsp'開始ページ</title> </head> <body> <c:foreach var =" me "items =" $ {map} "> <c:url value ="/servlet/downloadservlet "var =" downurl " value = "$ {me.key}"> </c:param> </c:url> $ {me.value} <a href = "$ {downurl}">ダウンロード</a> <br/> </c:foreach> </body> </html>処理サーブレットをダウンロードします
public class downloadServletはhttpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string filename = request.getparameter( "filename"); //23239283-92489-AVATAR.AVI FILENAME = new String(filename.getBytes( "ISO8859-1")、 "utf-8"); string path = makepath(filename、this.getServletContext()。getRealPath( "/web-inf/upload"));ファイルfile = new file(path + "//" + filename); if(!file.exists()){request.setattribute( "message"、 "ダウンロードするリソースが削除されました!!"); request.getRequestDispatcher( "/message.jsp")。戻る; } string realname = filename.substring(filename.indexof( "_")+1); Response.setheader( "content-disposition"、 "attachment; filename =" + urlencoder.encode(realname、 "utf-8")); fileInputStream in = new fileInputStream(path + "//" + filename); outputStream out = response.getOutputStream();バイトバッファー[] = new byte [1024]; int len = 0; while((len = in.read(buffer))> 0){out.write(buffer、0、len); } in.close(); out.close(); } public string makepath(string filename、string savepath){int hashcode = filename.hashcode(); int dir1 = hashcode&0xf; // 0-15 int dir2 =(hashcode&0xf0)>> 4; // 0-15文字列dir = savepath + "//" + dir1 + "//" + dir2; //アップロード/2/3アップロード/3/5ファイル= new File(dir); if(!file.exists()){file.mkdirs(); } return dir; } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。