Μεταφόρτωση και λήψη αρχείων 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: Εδώ ελέγχουμε αν ο τύπος περιεχομένου είναι πολυμερής/φόρμα-δεδομένα. Εάν συμβαίνει αυτό, τότε το περιεχόμενο είναι τύπου αρχείου και διαβάζεται. Μετά την ανάγνωση του αρχείου, γράφεται στο προσωρινό αρχείο και στη συνέχεια το προσωρινό αρχείο μετατρέπεται στο κύριο αρχείο.
Όταν εκτελείτε τον παραπάνω κώδικα, λαμβάνετε την ακόλουθη έξοδο
Παραγωγή:
Ανεβάζουμε αρχείο χρησιμοποιώντας την επιλογή κουμπιού επιλογής αρχείου και το κουμπί αποστολής αρχείου θα μεταφορτώσει το αρχείο στον διακομιστή στη διαδρομή που παρέχεται.
Παράδειγμα: Χρήση λειτουργιών JSP
Σε αυτό το παράδειγμα, πρόκειται να ανεβάσουμε ένα αρχείο χρησιμοποιώντας λειτουργίες JSP. Θα λάβουμε μια φόρμα που θα έχει το κουμπί «upload» και όταν κάνετε κλικ στο κουμπί upload τότε το αρχείο θα μεταφορτωθεί.
Uploading_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: Εδώ παίρνουμε μια φόρμα που έχει δράση στο servlet guru_upload που θα περάσει από μια μέθοδο POST. Επίσης, εδώ πληκτρολογούμε το χαρακτηριστικό ie που καθορίζει τον τρόπο κωδικοποίησης και αποστολής των δεδομένων φόρμας στον διακομιστή και χρησιμοποιείται μόνο με τη μέθοδο POST. Εδώ ορίζουμε ως multipart/form-data που είναι για το αρχείο (καθώς τα δεδομένα θα είναι μεγάλα).
Κωδικός Γραμμή 13: Εδώ καθορίζουμε το στοιχείο guru_file με αρχείο τύπου και δίνουμε μέγεθος ως 50.
Κωδικός Γραμμή 15: Αυτό είναι ένα κουμπί υποβολής με το όνομα "Upload" σε αυτό μέσω του οποίου θα κληθεί ο διακομιστής ενεργειών και θα επεξεργαστεί το αίτημα σε αυτό και το αρχείο θα διαβαστεί και θα εγγραφεί στο servlet.
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 στη διαμόρφωση του κώδικα. Θα πρέπει να εισαγάγουμε κλάση αποστολής αρχείων από τη βιβλιοθήκη org.apache.commons.
Κωδικός Γραμμή 23: Εδώ έχουμε τη μέθοδο doPost(), η οποία θα καλείται καθώς περνάμε τη μέθοδο POST στο JSP και θα ζητά και θα απαντά αντικείμενα ως παραμέτρους της
Κωδικός Γραμμή 26: Εδώ δημιουργούμε ένα αντικείμενο της κλάσης ServletFileUpload από το πακέτο fileUpload από τη βιβλιοθήκη org.apache.commons που θα ελέγξει αν υπάρχουν αντικείμενα αρχείου στο JSP. Εάν βρεθεί κάποιο, αυτό το αντικείμενο αρχείου θα ληφθεί από το αίτημα.
Κωδικός Γραμμή 27-32: Θα επαναλάβουμε τον αριθμό των αρχείων ελέγχοντας πόσα στοιχεία αρχείου υπάρχουν σε αντικείμενο πολλαπλών τμημάτων που είναι αντικείμενο λίστας (αν ανεβάσουμε περισσότερα από ένα αρχεία) και θα το αποθηκεύσουμε στον φάκελο c:/guru/upload με το όνομα αρχείου που έχει δοθεί . Γράφουμε το αρχείο χρησιμοποιώντας τη μέθοδο εγγραφής του αντικειμένου αρχείου στον φάκελο που αναφέρθηκε.
Κωδικός Γραμμή 34: Εάν δεν υπάρχει εξαίρεση, τότε ορίζουμε το χαρακτηριστικό στο αίτημα ως gurumessage με την τιμή "File uploaded with επιτυχημένα".
Κωδικός Γραμμή 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: Εδώ τυπώνουμε αυτό το μήνυμα.
Όταν εκτελούμε τον παραπάνω κώδικα έχουμε την ακόλουθη έξοδο
Παραγωγή:
Λαμβάνουμε μια φόρμα όπου υπάρχουν πεδία για να επιλέξετε ένα αρχείο από τον κατάλογο. Αφού επιλεγεί το αρχείο τότε πρέπει να κάνουμε κλικ στο κουμπί upload.
Μόλις κάνετε κλικ στο κουμπί αποστολής, λαμβάνουμε το μήνυμα ότι το αρχείο μεταφορτώθηκε με επιτυχία.
Στο παρακάτω διάγραμμα μπορούμε να δούμε ότι το αρχείο είχε μεταφορτωθεί στον φάκελο c:/guru/upload.
Λήψη αρχείου JSP
Σε αυτό το παράδειγμα, πρόκειται να κατεβάσουμε ένα αρχείο από έναν κατάλογο κάνοντας κλικ στο κουμπί.
Downloading_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 servlet που επεκτείνει το HttpServlet.
Κωδικός Γραμμή 18: Όπως έχουμε ορίσει ένα href, το οποίο θα περικλείεται σε URL, έτσι και η μέθοδος GET θα υποβληθεί σε επεξεργασία (το doGet θα καλείται στο servlet) το οποίο περικλείει επίσης αντικείμενα αιτήματος και απόκρισης.
Κωδικός Γραμμή 19-20: Ρυθμίζουμε το περιεχόμενο Τύπος σε αντικείμενο απάντησης και επίσης λαμβάνουμε αντικείμενο εγγραφής από απάντηση.
Κωδικός Γραμμή 21-22: Ορισμός μεταβλητής ως gurufile ως τιμή test.txt και gurupath ως c:/guru/upload/
Κωδικός Γραμμή 23-25: Ορίζουμε τον τύπο περιεχομένου χρησιμοποιώντας το αντικείμενο απάντησης και χρησιμοποιούμε τη μέθοδο setHeader που ορίζει την κεφαλίδα στο αντικείμενο απόκρισης ως το όνομα αρχείου που έχει μεταφορτωθεί.
Κωδικός Γραμμή 27-28: Δημιουργούμε FileInputStream στο οποίο θα προσθέσουμε gurupath+gurufile.
Κωδικός Γραμμή 31-33: Εδώ έχουμε πάρει ένα ενώ βρόχος που θα τρέξει μέχρι να διαβαστεί το αρχείο, επομένως έχουμε δώσει συνθήκη ως != -1. Σε αυτήν την κατάσταση γράφουμε χρησιμοποιώντας το αντικείμενο εκτύπωσης έξω.
Όταν εκτελέσετε τον παραπάνω κώδικα θα λάβετε την ακόλουθη έξοδο
Παραγωγή:
Παραγωγή:
Πρέπει να κάνουμε κλικ στο downloading_1.jsp και θα λάβουμε έναν υπερσύνδεσμο ως «Λήψη εδώ». Όταν κάνετε κλικ σε αυτό το αρχείο υπερ-σύνδεσης, θα γίνει λήψη στο σύστημα.
Περίληψη
- Μάθαμε για τη φόρμα εγγραφής για εγγραφή σε οποιαδήποτε αίτηση
- Μάθετε περισσότερα για το πώς λειτουργούν οι φόρμες σύνδεσης και αποσύνδεσης.
- Έμαθε επίσης για τη μεταφόρτωση και τη λήψη ενός αρχείου μέσω JSP.