Servlets - Tải lên tệp
Servlet có thể được sử dụng với thẻ biểu mẫu HTML để cho phép người dùng tải tệp lên máy chủ. Tệp được tải lên có thể là tệp văn bản hoặc tệp hình ảnh hoặc bất kỳ tài liệu nào.
Tạo biểu mẫu tải lên tệp
Mã HTM sau đây tạo biểu mẫu người tải lên. Sau đây là những điểm quan trọng cần lưu ý:
Hình thức method thuộc tính phải được đặt thành POST phương pháp và phương thức GET không thể được sử dụng
Hình thức enctype thuộc tính phải được đặt thành multipart/form-data.
Hình thức actionthuộc tính phải được đặt thành một tệp servlet sẽ xử lý việc tải tệp lên tại máy chủ phụ trợ. Ví dụ sau đang sử dụngUploadServlet servlet để tải tệp lên.
Để tải lên một tệp, bạn nên sử dụng một thẻ <input ... /> với thuộc tính type = "file". Để cho phép tải lên nhiều tệp, hãy bao gồm nhiều thẻ đầu vào với các giá trị khác nhau cho thuộc tính tên. Trình duyệt liên kết nút Duyệt với mỗi nút trong số chúng.
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
<input type = "file" name = "file" size = "50" />
<br />
<input type = "submit" value = "Upload File" />
</form>
</body>
</html>
Điều này sẽ hiển thị kết quả sau cho phép chọn một tệp từ PC cục bộ và khi người dùng nhấp vào "Tải lên tệp", biểu mẫu sẽ được gửi cùng với tệp đã chọn -
File Upload:
Select a file to upload:
NOTE: This is just dummy form and would not work.
Viết phụ trợ Servlet
Sau đây là servlet UploadServletsẽ đảm nhận việc chấp nhận tệp đã tải lên và lưu trữ tệp đó trong thư mục <Tomcat-installation-directory> / webapps / data. Tên thư mục này cũng có thể được thêm vào bằng cách sử dụng cấu hình bên ngoài chẳng hạn nhưcontext-param phần tử trong web.xml như sau:
<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>
Sau đây là mã nguồn cho UploadServlet có thể xử lý tải lên nhiều tệp cùng một lúc. Trước khi tiếp tục, bạn phải đảm bảo những điều sau:
Ví dụ sau phụ thuộc vào FileUpload, vì vậy hãy đảm bảo rằng bạn có phiên bản mới nhất của commons-fileupload.x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/fileupload/.
FileUpload phụ thuộc vào Commons IO, vì vậy hãy đảm bảo bạn có phiên bản mới nhất của commons-io-x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/io/.
Trong khi thử nghiệm ví dụ sau, bạn nên tải lên tệp có kích thước nhỏ hơn maxFileSize nếu không tệp sẽ không được tải lên.
Đảm bảo rằng bạn đã tạo trước các thư mục c: \ temp và c: \ apache-tomcat8.0.28 \ webapps \ data.
// Import required java libraries
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( ){
// Get the file location where it would be stored.
filePath = getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
// Check that we have a file upload request
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();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try {
// Parse the request to get file items.
List fileItems = upload.parseRequest(request);
// Process the uploaded file items
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 () ) {
// Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// Write the file
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.");
}
}
}
Biên dịch và chạy Servlet
Biên dịch ở trên Servlet UploadServlet và tạo mục nhập bắt buộc trong tệp web.xml như sau.
<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>
Bây giờ hãy thử tải tệp lên bằng biểu mẫu HTML mà bạn đã tạo ở trên. Khi bạn thử http: // localhost: 8080 / UploadFile.htm, nó sẽ hiển thị kết quả sau giúp bạn tải lên bất kỳ tệp nào từ máy cục bộ của mình.
File Upload:
Select a file to upload:
Nếu tập lệnh servlet của bạn hoạt động tốt, tệp của bạn phải được tải lên trong thư mục c: \ apache-tomcat8.0.28 \ webapps \ data \.