การอัพโหลดและดาวน์โหลดไฟล์ JSP
ในตัวอย่างนี้ เราจะเรียนรู้เกี่ยวกับการอัพโหลดและการดาวน์โหลดไฟล์ผ่าน JSP
อินพุตเอาต์พุตของไฟล์เป็นการดำเนินการที่สำคัญมาก ในที่นี้เราจะอ่านและเขียนไฟล์โดยใช้ JSP
การอัพโหลดไฟล์ JSP
- เราสามารถอัพโหลดไฟล์ใด ๆ โดยใช้ JSP
- อาจเป็นไฟล์ข้อความ ไฟล์ไบนารี ไฟล์รูปภาพ หรือเอกสารอื่นๆ
- ในกรณีที่อัปโหลดไฟล์ จะมีการใช้วิธี POST เท่านั้น ไม่ใช่วิธี GET
- ควรตั้งค่าแอตทริบิวต์ Enctype เป็น multipart/form-data
ตัวอย่าง: การใช้การกระทำ
ในตัวอย่างนี้ เรากำลังอัปโหลดไฟล์โดยใช้ออบเจ็กต์ IO
Action_file.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
Action_file_upload.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ 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.*" %>
<!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=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
String filePath = "E:/guru99/data";
String contentType = request.getContentType();
if ((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 fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<body>");
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
String fieldName = fi.getFieldName();
String fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
file = new File( filePath + "yourFileName") ;
fi.write( file ) ;
out.println("Uploaded Filename: " + filePath + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}else{
out.println("<html>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
}
%>
</body>
</html>
คำอธิบายของรหัส:
Action_file.jsp
รหัสบรรทัด 12-18: ที่นี่เรากำลังสร้างแบบฟอร์มพร้อมฟิลด์ไฟล์ซึ่งจะอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์และการดำเนินการจะถูกส่งไปที่ action_file_upload.jsp
Action_file_upload.jsp
รหัสบรรทัด 20: ที่นี่เราจะให้เส้นทางของไฟล์ไปยังเส้นทางเฉพาะ
รหัสบรรทัด 23-38: ที่นี่เราตรวจสอบว่าประเภทเนื้อหาเป็นแบบ multipart/form-data หรือไม่ หากเป็นเช่นนั้น เนื้อหาจะเป็นประเภทไฟล์และจะถูกอ่าน หลังจากอ่านไฟล์แล้ว ไฟล์จะถูกเขียนลงในไฟล์ชั่วคราว จากนั้นไฟล์ชั่วคราวจะถูกแปลงเป็นไฟล์หลัก
เมื่อคุณรันโค้ดข้างต้น คุณจะได้รับผลลัพธ์ดังต่อไปนี้
Output:
เรากำลังอัปโหลดไฟล์โดยใช้ตัวเลือกปุ่มเลือกตัวเลือกไฟล์ และปุ่มอัปโหลดไฟล์จะอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ไปยังเส้นทางที่ให้ไว้
ตัวอย่าง: การใช้การดำเนินการ JSP
ในตัวอย่างนี้ เราจะอัปโหลดไฟล์โดยใช้การดำเนินการ JSP เราจะสร้างฟอร์มที่มีปุ่ม "อัปโหลด" และเมื่อคุณคลิกปุ่มอัปโหลด ไฟล์จะถูกอัปโหลด
กำลังอัพโหลด_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
คำอธิบายของรหัส:
รหัสบรรทัด 11-12: ที่นี่เราใช้ฟอร์มที่มีการดำเนินการกับเซิร์ฟเล็ต guru_upload ซึ่งจะผ่านเมธอด POST นอกจากนี้ ที่นี่เราพิมพ์แอตทริบิวต์ ie ซึ่งระบุว่าข้อมูลฟอร์มควรเข้ารหัสและส่งไปยังเซิร์ฟเวอร์อย่างไร และจะใช้กับเมธอด POST เท่านั้น ที่นี่เราตั้งค่าเป็น multipart/form-data ซึ่งใช้สำหรับไฟล์ (เนื่องจากข้อมูลจะมีขนาดใหญ่)
รหัสบรรทัด 13: ที่นี่เรากำลังระบุองค์ประกอบ guru_file ด้วยประเภทไฟล์และกำหนดขนาดเป็น 50
รหัสบรรทัด 15: นี่คือปุ่มประเภทการส่งที่มีชื่อ "อัปโหลด" ซึ่งจะถูกเรียกใช้เซิร์ฟเล็ตการดำเนินการและคำขอจะถูกประมวลผลและไฟล์จะถูกอ่านและเขียนลงในเซิร์ฟเล็ต
Guru_upload.java
package demotest;
import java.io.File;
import java.io.IOException;
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 guru_upload extends HttpServlet {
private static final long serialVersionUID = 1L;
public guru_upload() {
super();
// TODO Auto-generated constructor stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(request)){
try {
List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for(FileItem item : multiparts){
if(!item.isFormField()){
String name = new File(item.getName()).getName();
item.write( new File("c:/guru/upload" + File.separator + name));
}
}
//File uploaded successfully
request.setAttribute("gurumessage", "File Uploaded Successfully");
} catch (Exception ex) {
request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
}
}else{
request.setAttribute("gurumessage","No File found");
}
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
คำอธิบายของรหัส:
รหัสบรรทัด 12-14: ที่นี่เราจะต้องนำเข้าไลบรารี org.apache.commons ไปยังการกำหนดค่าของโค้ด เราจะต้องนำเข้าคลาส fileupload จากไลบรารี org.apache.commons
รหัสบรรทัด 23: ที่นี่เรามีเมธอด doPost() ซึ่งจะถูกเรียกเมื่อเราส่งเมธอด POST ใน JSP และมันจะร้องขอและตอบสนองออบเจ็กต์เป็นพารามิเตอร์
รหัสบรรทัด 26: ที่นี่เรากำลังสร้างอ็อบเจ็กต์ของคลาส ServletFileUpload จากแพ็คเกจ fileUpload จากไลบรารี org.apache.commons ซึ่งจะตรวจสอบว่ามีอ็อบเจ็กต์ไฟล์ใด ๆ ใน JSP หรือไม่ หากพบไฟล์ออบเจ็กต์เหล่านั้นจะถูกพรากไปจากการร้องขอ
รหัสบรรทัด 27-32: เราจะวนซ้ำจำนวนไฟล์โดยตรวจสอบว่ามีรายการไฟล์จำนวนเท่าใดในวัตถุหลายส่วนซึ่งเป็นวัตถุรายการ (หากเราอัปโหลดมากกว่าหนึ่งไฟล์) และบันทึกลงในโฟลเดอร์ c:/guru/upload ด้วยชื่อไฟล์ที่ให้ไว้ . เรากำลังเขียนไฟล์โดยใช้วิธีเขียนของ fileobject ลงในโฟลเดอร์ที่ได้รับการกล่าวถึง
รหัสบรรทัด 34: หากไม่มีข้อยกเว้น เรากำลังตั้งค่าแอตทริบิวต์ในคำขอเป็น gurumessage ที่มีค่า "อัปโหลดไฟล์สำเร็จ"
รหัสบรรทัด 35-36: หากมีข้อยกเว้นเกิดขึ้น ให้ตั้งค่าข้อความว่า “การอัพโหลดไฟล์ล้มเหลว”
รหัสบรรทัด 40: หากไม่พบไฟล์ ให้ตั้งค่าข้อความเป็น “ไม่พบไฟล์”
รหัสบรรทัด 42: การส่งต่อคำขอโดยใช้วัตถุ requestdispatcher ไปยัง result.jsp พร้อมกับวัตถุคำขอและการตอบสนอง
ผลลัพธ์.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
out.println(msg);
%>
</body>
</html>
คำอธิบายของรหัส:
รหัสบรรทัด 10: ที่นี่เราได้รับแอตทริบิวต์จากวัตถุคำขอที่มีค่า gurumessage ลงในวัตถุสตริง
รหัสบรรทัด 11: ที่นี่เรากำลังพิมพ์ข้อความนั้น
เมื่อเรารันโค้ดด้านบน เราจะได้ผลลัพธ์ดังต่อไปนี้
Output:
เราได้รับแบบฟอร์มที่มีช่องให้เลือกไฟล์จากไดเร็กทอรี เมื่อเลือกไฟล์แล้ว เราจะต้องคลิกที่ปุ่มอัปโหลด
เมื่อคลิกปุ่มอัปโหลดแล้ว เราได้รับข้อความว่าอัปโหลดไฟล์สำเร็จ
ในแผนภาพด้านล่าง เราจะเห็นว่าไฟล์ดังกล่าวได้รับการอัปโหลดในโฟลเดอร์ c:/guru/upload
ดาวน์โหลดไฟล์ JSP
ในตัวอย่างนี้ เราจะดาวน์โหลดไฟล์จากไดเร็กทอรีโดยคลิกที่ปุ่ม
กำลังดาวน์โหลด_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>
คำอธิบายของรหัส:
รหัสบรรทัด 10: ที่นี่เราได้ให้ลิงค์สำหรับดาวน์โหลดไฟล์จากโฟลเดอร์ c:/guru/upload โดยใช้ servlet guru_download
Guru_download.java
package demotest;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class guru_download
*/
public class guru_download extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String gurufile = "test.txt";
String gurupath = "c:/guru/upload/";
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ gurufile + "\"");
FileInputStream fileInputStream = new FileInputStream(gurupath
+ gurufile);
int i;
while ((i = fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
คำอธิบายของรหัส:
รหัสบรรทัด 3-5: ที่นี่เรากำลังนำเข้า FileInputStream , IO Exception และ PrintWriter จากแพ็คเกจ java.io
รหัสบรรทัด 15: เรากำลังกำหนด guru_download เซิร์ฟเล็ต ซึ่งขยาย HttpServlet
รหัสบรรทัด 18: ตามที่เราได้กำหนด href ซึ่งจะอยู่ใน URL ดังนั้นวิธี GET จะได้รับการประมวลผล (doGet จะถูกเรียกในเซิร์ฟเล็ต) ซึ่งล้อมรอบวัตถุคำขอและการตอบสนองด้วย
รหัสบรรทัด 19-20: เรากำลังตั้งค่าประเภทเนื้อหาในวัตถุตอบกลับและรับวัตถุตัวเขียนจากการตอบกลับ
รหัสบรรทัด 21-22: การกำหนดตัวแปรเป็น gurufile เป็นค่า test.txt และ gurupath เป็น c:/guru/upload/
รหัสบรรทัด 23-25: เรากำลังตั้งค่าประเภทเนื้อหาโดยใช้ออบเจ็กต์ตอบกลับ และเราใช้เมธอด setHeader ซึ่งตั้งค่าส่วนหัวให้กับออบเจ็กต์ตอบกลับเป็นชื่อไฟล์ที่ได้รับการอัปโหลด
รหัสบรรทัด 27-28: เรากำลังสร้าง FileInputStream โดยเราจะเพิ่ม gurupath+gurufile
รหัสบรรทัด 31-33: ที่นี่เราได้นำเอา ในขณะที่วนซ้ำ ซึ่งจะทำงานจนกว่าไฟล์จะถูกอ่าน ดังนั้นเราจึงกำหนดเงื่อนไขเป็น != -1 ในเงื่อนไขนี้ เรากำลังเขียนโดยใช้อ็อบเจ็กต์ตัวพิมพ์ออกมา
เมื่อคุณรันโค้ดด้านบน คุณจะได้รับผลลัพธ์ดังต่อไปนี้
Output:
Output:
เราต้องคลิกที่ downloading_1.jsp เราจะได้ไฮเปอร์ลิงก์เป็น "ดาวน์โหลดที่นี่" เมื่อคลิกที่ไฟล์ไฮเปอร์ลิงก์นี้ ไฟล์ดังกล่าวจะถูกดาวน์โหลดเข้าสู่ระบบ
สรุป
- เราได้เรียนรู้เกี่ยวกับแบบฟอร์มการลงทะเบียนเพื่อลงทะเบียนในแอปพลิเคชันต่างๆ
- เรียนรู้เพิ่มเติมเกี่ยวกับวิธีการทำงานของแบบฟอร์มการเข้าสู่ระบบและออกจากระบบ
- นอกจากนี้ยังเรียนรู้เกี่ยวกับการอัพโหลดและดาวน์โหลดไฟล์ผ่านทาง JSP





