នៅក្នុងមេរៀននេះ អ្នកនឹងបានសិក្សាអំពីការបង្កើត Java Servlet ដើម្បីអាចឲ្យ client អាចupload fileបាន ហើយនៅក្នុងនេះ យើងនឹងលើកយកចំនុចដូចខាងក្រោម៖
១. បង្កើត Form Upload ដែលអាចឲ្យclient ជ្រើសរើស file សំរាប់Upload
២. បង្កើត Java Servlet ដែលជាអ្នកធ្វើការងារនៅពេលដែល client បានបញ្ជូន file តាមរយៈ Form Upload ខាងលើ
៣. បង្កើតជា message page មួយសំរាប់បង្ហាញថា ការ upload file បានសម្រេច ឬ បរាជ័យ
ជាដំបូង សូមបង្កើត Dynamic Web Project មួយថ្មី (ប្រើប្រាស់ Eclipse) ដោយកំណត់ឈ្មោះរបស់ Project ថា UploadServletApp។ បន្ទាប់មកទៀត នៅក្នុង folder src សូមបង្កើតនូវ java package មួយថ្មី (ដែលយើងនឹងសរសេរកូដនៅក្នុងហ្នឹង) ហើយកំណត់ឈ្មោះវា (ឧទាហរណ៍៖ tk.itjonbot.tutorial.java.upload) ។
ដើម្បីអាចប្រើប្រាស់ Apache Common file upload api បាន អ្នកត្រូវdownload យក library ជាមិនសិន ហើយcopy-paste វាទៅក្នុង folder WebContent\WEB-INF\lib។ Library ទាំងនោះរួមមាន
១. commons-fileupload.-1.2.2.jar
២. commons-io-2.3.jar
ជំហានបន្ទាប់នេះ អ្នកត្រូវបង្កើតជា Form Upload សំរាប់អាចឲ្យclient ជ្រើសរើស file សំរាប់ upload ទៅកាន់ web server របស់អ្នកបាន។ ខាងក្រោមនេះ ជាកូដសំរាប់ បង្កើត Form Upload (index.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>File Upload</title>
</head>
<body>
<center>
<form method="post" action="upload" enctype="multipart/form-data">
Select file to upload: <input type="file" name="uploadFile" />
<br/><br/>
<input type="submit" value="Upload" />
</form>
</center>
</body>
</html>
ចំណាំ៖
១. method =”post” នៅពេលដែលclient ចុចលើbutton submit។ វាគឺចាំបាច់ព្រោះថា file’s content អាចបញ្ជូនបានតាមតែរយៈ HTTP POST method
២. action=”upload” កំណត់នូវទីតាំង ឬ url របស់ servlet ដែលនឹងhandle ការងារកាលណា client បញ្ជូន fileទៅ
៣. enctype=”multipart/form-date” បញ្ជាក់ថា form នេះមានផ្ទុកទិន្នន័យសំរាប់ upload
បន្ទាប់មក យើងត្រូវបង្កើតនូវ Servletមួយសំរាប់ handle ការងារខាងលើ ហើយសូមអនុវត្តដូចខាងក្រោម៖
១. បង្កើត Java Class មួយនៅក្នុង package ដែលយើងបានបង្កើតខាងលើ (tk.itjonbot.tutorial.java.upload) ហើយ class នេះត្រូវតែ extends ពី Class HttpServlet ហើយ override នូវmethod doPost ដូចខាងក្រោម៖
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String UPLOAD_DIRECTORY = "upload";
private static final int THRESHOLD_SIZE = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
/**
* ដោះស្រាយការងារ file upload តាមរយៈ HTTP POST method
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// ពិនិត្យមើលថាតើវាមាន file ដែរឬអត់?
if (!ServletFileUpload.isMultipartContent(request)) {
PrintWriter writer = response.getWriter();
writer.println("Request does not contain upload data");
writer.flush();
return;
}
// កំណត់ upload setting
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(THRESHOLD_SIZE);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(MAX_FILE_SIZE);
upload.setSizeMax(MAX_REQUEST_SIZE);
String uploadPath = getServletContext().getRealPath("")
+ File.separator + UPLOAD_DIRECTORY;
// បង្កើតជា directory ប្រសិនបើគ្មាន
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
try {
// ទាញយក file data ដែលបានupload
List formItems = upload.parseRequest(request);
Iterator iter = formItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
// រក្សាទុក file ដែលបាន upload
item.write(storeFile);
}
}
request.setAttribute("message", "Upload has been done successfully!");
} catch (Exception ex) {
request.setAttribute("message", "There was an error: " + ex.getMessage());
}
getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
}
}
យើងត្រូវបង្កើតនូវ jsp pageមួយទៀតសំរាប់បង្ហាញmessage ថាតើclient បានupload fileបានជោគជ័យ ឬ មិនបានជោគជ័យ។ខាងក្រោមនេះជាកូដ (message.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload</title>
</head>
<body>
<center>
<h2>${requestScope.message}</h2>
</center>
</body>
</html>
ជាចុងក្រោយ អ្នកត្រូវកំណត់នៅក្នុង web.xml សំរាប់ធ្វើការ map url ឲ្យត្រូវជាមួយ servlet ដែលយើងបានបង្កើត ដូចខាងក្រោម៖
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>UploadServletApp</display-name>
<servlet>
<description></description>
<display-name>UploadServlet</display-name>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>tk.itjonbot.tutorial.java.upload.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>