웹 애플리케이션 시스템의 개발에서 파일 업로드 및 다운로드 기능은 일반적으로 사용되는 기능입니다. 오늘은 Javaweb에서 파일 업로드 및 다운로드 기능의 구현에 대해 이야기 해 봅시다.
1. 간단한 예제를 업로드하십시오
JSP
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd xhtml 1.0 transitional // en"> <html> <head> <meta http-equiv = "contents"= "text/html; charset = utf-8 "/> <title> 파일 업로드 및 다운로드 </title> </head> <body> <form action ="$ {pagecontext.request.contextPath}/uploadServlet "EncType ="multipart/form-data "method ="input type = "text"name = "username". 이름 = "file1" /> <br /> 파일 업로드 파일 2 : <input type = "file"name = "file2" /> <br /> <입력 유형 = "value ="upload " /> < /form> <br /> $ {requestscope.message} < /bygry> < /html>서틀
public void doget (httpservletrequest request, httpservletresponse 응답)은 servletexception, ioexception {try {// 1. Parser Factory DiskFileItemFactory Factory = New DiskFileItemFactory (); // 2. Parser ServletfileUpload 업로드 = New ServletfileUpload (Factory)를 받으십시오. // 3. if (! upload.ismultipartContent (request)) {// 양식을 정상적인 양식으로, 기존 방식으로 데이터를 얻고 리턴을 얻습니다. } // 양식을 업로드하려면 파서가 호출되어 업로드 데이터 목록을 구문 분석하도록 요청됩니다. // fileItem // 목록을 트랜스팅하여 첫 번째 업로드 항목 데이터 데이터 파일에 대한 (파일 항목 : list) {if (item.isformfield ()) {// 당신이 얻는 것은 일반 입력 문자열 이름 = item.getfieldName (); // 입력 항목의 이름을 가져옵니다. 문자열 값 value = item.getString (); System.out.println (name + "=" + value); } else {// 업로드 입력 항목을 가져옵니다. string filename = item.getName (); // 업로드 된 파일 이름 C :/Documents 및 Settings/ThinkPad/Desktop/1.txt filename = filename.substring (filename.lastIndexof ( "//")+1); inputStream in = item.getInputStream (); // 업로드 된 데이터 int int len = 0; 바이트 버퍼 [] = 새로운 바이트 [1024]; // 업로드 된 파일을 저장하는 데 사용되는 디렉토리는 외부 세계가 String savepath = this.getServletContext (). getRealPath ( "/web-inf/upload")에 직접 액세스하는 것을 금지해야합니다. System.out.println (SavePath); fileoutputStream out = 새 FileOutputStream (SavePath + "/" + filename); // 업로드 디렉토리에 파일을 쓰기 while } in.close (); out.close (); request.setAttribute ( "메시지", "성공 업로드"); }}}} 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.filesizelimitexeceedEdexception 예외는 사용자 친화적 인 프롬프트를 제공합니다
6. 임시 파일이 삭제되었는지 확인하려면 item.delete 메소드를 업로드 한 후 파일을 처리 한 후에 호출해야합니다.
7. 업로드 된 파일 유형을 제한하려면 : 업로드 된 파일 이름을 수신 할 때 접미사 이름이 합법적인지 확인하십시오.
8. 파일 업로드 진행 상황을 듣습니다.
ServletFileUpload 업로드 = 새로운 ServletFileUpload (공장); upload.setProgressListener (new ProgressListener () {public void update (long pbytesread, long pcontentlength, int arg2) {system.out.println ( "파일 크기는" + pcontentlength + ", 현재 처리 된 :" + pbytesread);}); 9. 웹 페이지에서 파일 업로드 입력 항목을 동적으로 추가합니다.
함수 addInput () {var div = document.getElementById ( "file"); var input = document.createElement ( "입력"); input.type = "파일"; input.name = "filename"; var del = document.createelement ( "입력"); del.type = "버튼"; del.Value = "삭제"; del.onclick = function d () {this.parentNode.parentNode.RemoveChild (this.parentNode); } var innerDiv = document.createElement ( "div"); InnerDiv. AppendChild (입력); Innerdiv. AppendChild (del); Div.AppendChild (InnerDiv); }JSP 업로드 :
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 전환 // en"> <html> <head> <title> my jsp 'upload2.jsp'upport2.jsp '시작 페이지 <script type'script <html> <head> <title> addInput () {var div = document.getElementById ( "file"); var input = document.createElement ( "입력"); input.type = "파일"; input.name = "filename"; var del = document.createelement ( "입력"); del.type = "버튼"; del.Value = "삭제"; del.onclick = function d () {this.parentNode.parentNode.RemoveChild (this.parentNode); } var innerDiv = document.createElement ( "div"); InnerDiv. AppendChild (입력); Innerdiv. AppendChild (del); Div.AppendChild (InnerDiv); }. value = "onclick ="onclick = "addInput ()"> </td> </tr> <td> <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("username "); // **** 오류 요청 .SetchAracterEncoding ( "UTF-8"); // 양식이 파일에 업로드되어 있고 요청 인코딩이 유효하지 않습니다. // 업로드 된 파일 SavePath = this.getServletContext (). getRealPath ( "/web-inf/ubload"); try {diskfileitemfactory factory = new diskfileitemfactory (); factory.setRepository (새 파일 (this.getServletContext (). getRealPath ( "/web-inf/temp")); ServletFileUpload 업로드 = 새로운 ServletFileUpload (공장); / upload.setProgressListener (new progressListener () {public void update (long pbytesread, long pcontentlength, int arg2) {system.out.println ( "파일 크기 :" + pcontentlength + ", 현재 처리 된 :" + pbytesread);}); // 파일 이름을 업로드하는 중국어가 달린 코드를 해결합니다. } /* upload.setfilesizemax(1024); upload.setsizemax (1024*10);*/ list <fileItem> list = upload.parsEerquest (요청); for (fileitem item : list) {if (item.isformfield ()) {// 일반 입력 항목의 데이터는 fileItem String name = item.getFieldName ()에 캡슐화됩니다. 문자열 값 = item.getString ( "UTF-8"); // value = new String (value.getBytes ( "iso8859-1"), "utf-8"); System.out.println (name + "=" + value); } else {// 업로드 파일은 fileItem string filename = item.getName ()에 캡슐화됩니다. // 다른 브라우저에서 제출 한 파일은 다릅니다. c : /a/b/1.txt 1.txt System.out.println (filename); if (filename == null || filename.trim (). equals ( "")) {계속; } filename = filename.substring (filename.lastIndexof ( "//")+1); inputStream in = item.getInputStream (); 문자열 savefilename = makeFilename (filename); // 파일 저장된 파일의 이름을 가져옵니다. string realSavePath = makePath (SaveFilename, SavePath); // 파일을 가져옵니다 Directory Save FileOutputStream out = new FileOutputStream (realSavePath + "//" + SaveFileName); 바이트 버퍼 [] = 새로운 바이트 [1024]; int len = 0; while ((len = in.read (buffer))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); item.delete (); // 임시 파일}}} catch (fileUploadBase.FileSizelimiteXeceedEdException e) {e.printstacktrace (); request.setAttribute ( "메시지", "파일이 최대 값을 초과합니다!!"); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); 반품; } catch (예외 e) {e.printstacktrace (); }} public String makefilename (String filename) {//2.jpg return uuid.randomuuid (). toString () + "_" + filename; } public String makepath (String filename, String savepath) {int hashcode = filename.hashcode (); int dir1 = 해시 코드 & 0xf; // 0--15 int dir2 = (Hashcode & 0xf0) >> 4; // 0-15 String dir = savepath + "//" + dir1 + "//" + dir2; // 업로드/2/3 업로드/3/5 파일 파일 = 새 파일 (DIR); if (! file.exists ()) {file.mkdirs (); } return dir; } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}3. 기능을 다운로드하십시오
// 웹 사이트에 모든 다운로드 파일을 나열 공개 클래스 ListFileservlet 확장 httpservlet {public void doget (httpservletrequest request, httpservletreponse responsk) servletexception, ioexception {string filepath = this.getServletContext (). 지도 맵 = new Hashmap (); ListFile (새 파일 (FilePath),지도); request.setAttribute ( "지도",지도); request.getRequestDispatcher ( "/listfile.jsp"). FORMPER (요청, 응답); } public void listfile (파일 파일, 맵 맵) {if (! file.isfile ()) {파일 파일 [] = 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.PUP (file.getName (), realName); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}JSP 디스플레이
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <%@ taglib prefix = "c"uri = "http://java.sun.com/jsp/jstl/core"%> <! apttype html public "-//01 전환 // en "> <html> <head> <title> 내 jsp 'listfile.jsp'시작 페이지 </title> </head> <cod> <c : foreach var ="me "items ="$ {map} "> <c : url value ="/servlet/downloadservlet "var ="downurl "> <c : param name ="filename " 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, httpservletreponse response)를 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")); 파일 = 새 파일 (path + "//" + filename); if (! file.exists ()) {request.setAttribute ( "message", "다운로드하려는 리소스가 삭제되었습니다 !!"); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); 반품; } string realname = filename.substring (filename.indexof ( "_")+1); response.setHeader ( "Content-Disposition", "첨부 파일; filename =" + urlencoder.encode (realName, "utf-8")); fileInputStream in = new FileInputStream (path + "//" + filename); outputStream out = response.getOutputStream (); 바이트 버퍼 [] = 새로운 바이트 [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 = 해시 코드 & 0xf; // 0--15 int dir2 = (Hashcode & 0xf0) >> 4; // 0-15 String dir = savepath + "//" + dir1 + "//" + dir2; // 업로드/2/3 업로드/3/5 파일 파일 = 새 파일 (DIR); if (! file.exists ()) {file.mkdirs (); } return dir; } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.