서블릿 파일 업로드
서블릿은 HTML 양식 태그와 함께 사용되어 사용자가 서버에 파일을 업로드할 수 있습니다. 업로드된 파일은 텍스트 파일, 이미지 파일 또는 모든 문서일 수 있습니다.
파일 업로드 양식 만들기
다음 HTML 코드는 파일 업로드 양식을 만듭니다. 다음 사항에 유의해야 합니다.
형식 method 속성은 POST 메서드로 설정되어야 하며, GET 메서드는 설정할 수 없습니다. 사용된.
formenctype 속성은 multipart/form-data.
form으로 설정되어야 합니다. action 속성은 백엔드 서버에서 파일 업로드를 처리하는 서블릿 파일로 설정되어야 합니다. 아래 예에서는 UploadServlet 서블릿을 사용하여 파일을 업로드합니다.
단일 파일을 업로드하려면 type="file" 속성이 있는 단일 <input .../> 태그를 사용해야 합니다. 여러 파일 업로드를 허용하려면 이름 속성 값이 다른 여러 입력 태그를 포함하십시오. 입력 태그는 이름 속성에 대해 서로 다른 값을 갖습니다. 브라우저는 찾아보기 버튼을 각 입력 태그와 연결합니다.
<html> <head> <title>文件上传表单</title> </head> <body> <h3>文件上传:</h3> 请选择要上传的文件:<br /> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="上传文件" /> </form> </body> </html>
다음 결과가 표시되어 사용자가 로컬 컴퓨터에서 파일을 선택할 수 있습니다. 사용자가 "파일 업로드"를 클릭하면 양식이 파일과 함께 제출됩니다. 로컬 컴퓨터에서 선택됨:
<b>文件上传:</b> 请选择要上传的文件:<br /> <input type="file" name="file" size="50" /> <br /> <input type="button" value="上传文件" /> <br /> 注:这只是虚拟的表单,不会正常工作。
백그라운드 서블릿 작성
다음은 업로드된 파일을 수락하고 < 데이터의 Tomcat-installation-directory>/webapps/. 이 디렉토리 이름은 아래와 같이 web.xml의 context-param 요소와 같은 외부 구성을 사용하여 추가할 수도 있습니다. <web-app>
....
<context-param>
<description>Location to store uploaded file</description>
<param-name>file-upload</param-name>
<param-value>
c:\apache-tomcat-5.5.29\webapps\data\
</param-value>
</context-param>
....
</web-app>
다음은 UploadServlet의 소스 코드입니다. 여러 파일 업로드를 처리할 수 있습니다. 진행하기 전에 다음 사항을 확인하세요.
- 아래 예는 FileUpload에 따라 다르므로 클래스 경로에
- commons-fileupload의 최신 버전이 있는지 확인하세요<🎜. > 파일. http://commons.apache.org/fileupload/에서 다운로드할 수 있습니다.
FileUpload는 Commons IO에 따라 다르므로 클래스 경로에 최신 버전의
commons-io-x.x.jar - 파일이 있어야 합니다. http://commons.apache.org/io/에서 다운로드할 수 있습니다.
다음 예를 테스트할 때 업로드하는 파일 크기는
maxFileSize - 보다 클 수 없습니다. 그렇지 않으면 파일이 업로드되지 않습니다.
c:temp 및 c:apache-tomcat-5.5.29webappsdata 디렉터리가 미리 생성되었는지 확인하세요.
// 导入必需的 java 库 import java.io.*; import java.util.*; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.output.*; public class UploadServlet extends HttpServlet { private boolean isMultipart; private String filePath; private int maxFileSize = 50 * 1024; private int maxMemSize = 4 * 1024; private File file ; public void init( ){ // 获取文件将被存储的位置 filePath = getServletContext().getInitParameter("file-upload"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 检查我们有一个文件上传请求 isMultipart = ServletFileUpload.isMultipartContent(request); response.setContentType("text/html"); java.io.PrintWriter out = response.getWriter( ); if( !isMultipart ){ out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); return; } DiskFileItemFactory factory = new DiskFileItemFactory(); // 文件大小的最大值将被存储在内存中 factory.setSizeThreshold(maxMemSize); // Location to save data that is larger than maxMemSize. factory.setRepository(new File("c:\temp")); // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(factory); // 允许上传的文件大小的最大值 upload.setSizeMax( maxFileSize ); try{ // 解析请求,获取文件项 List fileItems = upload.parseRequest(request); // 处理上传的文件项 Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { // 获取上传文件的参数 String fieldName = fi.getFieldName(); String fileName = fi.getName(); String contentType = fi.getContentType(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); // 写入文件 if( fileName.lastIndexOf("\") >= 0 ){ file = new File( filePath + fileName.substring( fileName.lastIndexOf("\"))) ; }else{ file = new File( filePath + fileName.substring(fileName.lastIndexOf("\")+1)) ; } fi.write( file ) ; out.println("Uploaded Filename: " + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { throw new ServletException("GET method used with " + getClass( ).getName( )+": POST method required."); } }
서블릿 컴파일 및 실행
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
이제 위에서 만든 HTML 양식을 사용하여 파일을 업로드해 보세요. 브라우저에서 http://localhost:8080/UploadFile.htm을 방문하면 다음 결과가 표시되며, 이는 로컬 컴퓨터에서 파일을 업로드하는 데 도움이 됩니다. <b>文件上传:</b> 请选择要上传的文件:<br /> <input type="file" name="file" size="50" /> <br /> <input type="button" value="上传文件" />Servelt 스크립트가 제대로 작동하면 파일이 c:apache-tomcat-5.5.29webappsdata 디렉터리에 업로드됩니다.