JSP รองรับการอัปโหลดไฟล์ผ่าน HTML form ต้องกำหนดที่เก็บไฟล์ใน backend script
1. สร้าง HTML Upload Form
<html>
<head><title>ฟอร์มอัปโหลดไฟล์</title></head>
<body>
<h3>อัปโหลดไฟล์:</h3>
เลือกไฟล์: <br/>
<form action="UploadFile.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="50" /><br/>
<input type="submit" value="Upload File" />
</form>
</body>
</html>
จุดสำคัญของ Form:
method="POST"(GET ไม่ได้)enctype="multipart/form-data"(บังคับ)actionชี้ไป JSP/Servlet ที่จัดการ uploadinput type="file"สำหรับเลือกไฟล์
2. กำหนดที่เก็บไฟล์ (web.xml context-param)
<web-app>
<context-param>
<description>ที่เก็บไฟล์อัปโหลด</description>
<param-name>file-upload</param-name>
<param-value>C:/apache-tomcat/webapps/data/</param-value>
</context-param>
</web-app>
3. Backend JSP (UploadFile.jsp) - ใช้ Apache Commons FileUpload
<%@ page import="java.io.*,java.util.*,javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<%
int maxFileSize = 5000 * 1024; // 5MB
int maxMemSize = 5000 * 1024;
ServletContext context = pageContext.getServletContext();
String filePath = context.getInitParameter("file-upload");
String contentType = request.getContentType();
if (contentType != null && contentType.indexOf("multipart/form-data") >= 0) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
factory.setRepository(new File("C:\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxFileSize);
try {
List<FileItem> fileItems = upload.parseRequest(request);
out.println("<html><body><h3>ผลการอัปโหลด</h3>");
for (FileItem item : fileItems) {
if (!item.isFormField()) {
String fileName = item.getName();
File file = new File(filePath + fileName.substring(fileName.lastIndexOf("\\") + 1));
item.write(file);
out.println("อัปโหลดสำเร็จ: " + fileName + "<br/>");
}
}
out.println("</body></html>");
} catch (Exception ex) {
out.println("Error: " + ex.getMessage());
}
} else {
out.println("ไม่มีไฟล์อัปโหลด");
}
%>
ข้อกำหนดก่อนรัน
- เพิ่ม
commons-fileupload-x.x.jarและcommons-io-x.x.jarใน classpath (WEB-INF/lib) - สร้างโฟลเดอร์
C:\tempและC:\apache-tomcat\webapps\data\ให้มีอยู่ก่อน - ขนาดไฟล์ต้องไม่เกิน
maxFileSize
ที่เก็บไฟล์
ไฟล์จะถูกเก็บที่ path ที่กำหนดใน file-upload context-param (ตัวอย่าง: C:/apache-tomcat/webapps/data/)
หมายเหตุ
Servlet 3.0+ (Tomcat 7+) รองรับ @MultipartConfig และ request.getPart() ไม่ต้องใช้ library ภายนอก