JSP-tiedoston lataus ja lataus
⚡ Älykäs yhteenveto
JSP-tiedostojen lataus ja lähetys ovat keskeisiä syöttö- ja tulostusoperaatioita, joiden avulla verkkosovellus voi vastaanottaa tiedostoja käyttäjiltä ja toimittaa ne heille takaisin. Tämä resurssi selittää molemmat työnkulut JSP-toimintolomakkeiden, Apache Commons FileUploadin ja servlet-luokkien avulla täydellisellä toimivalla koodilla.

JSP-tiedoston lataus
- Voimme ladata mitä tahansa tiedostoja JSP:llä.
- Se voi olla tekstitiedosto, binääritiedosto, kuvatiedosto tai mikä tahansa muu asiakirja.
- Tässä tiedoston lataamisen tapauksessa käytetään vain POST-menetelmää, ei GET-menetelmää.
- Enctype-attribuutiksi tulee asettaa moniosainen/form-data.
Esimerkki: Toiminnon käyttäminen
Tässä esimerkissä lataamme tiedoston palvelimelle IO-objektin avulla.
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>
Koodin selitys:
Action_file.jsp
Code Rivi 12–18: Tässä luomme lomakkeen, jossa on tiedostokenttä. Tämä kenttä lataa tiedoston palvelimelle ja toiminto välitetään action_file_upload.jsp-tiedostolle.
Action_file_upload.jsp
Code Rivi 20: Tässä annamme tiedostopolun tiettyyn polkuun.
Code Rivi 23–38: Tässä tarkistetaan, onko sisällön tyyppi moniosaista/lomakedataa. Jos näin on, sisältö on tiedostotyyppiä ja se luetaan. Kun tiedosto on luettu, se kirjoitetaan väliaikaiseen tiedostoon, joka muunnetaan päätiedostoksi.
Kun suoritat yllä olevan koodin, saat seuraavan tulosteen:
lähtö:
Lataamme tiedoston käyttämällä Valitse tiedosto -painiketta, ja Lataa tiedosto -painike lataa tiedoston palvelimelle annettuun polkuun.
Esimerkki: JSP-toimintojen käyttäminen
Tässä esimerkissä lataamme tiedoston JSP-toimintoja käyttäen. Käytämme lomaketta, jossa on "lataa"-painike, ja kun napsautat latauspainiketta, tiedosto ladataan.
Lähetetään_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>
Koodin selitys:
Code Rivi 11–12: Tässä käytetään lomaketta, jolla on toiminto servlet guru_upload -luokassa, joka kulkee POST-metodin läpi. Lisäksi enctype-attribuutti määrittää, miten lomakedata koodataan ja lähetetään palvelimelle, ja sitä käytetään vain POST-metodin kanssa. Tässä asetamme sen muotoon multipart/form-data, joka on tiedostoa varten (koska data on suuri).
Code Rivi 13: Tässä määritämme guru_file-elementin tyypillä file ja koolla 50.
Code Rivi 15: Tämä on lähetystyyppinen painike, jonka nimi on ”Upload” (Lähetä). Sen kautta kutsutaan toimintoservlettiä, pyyntö käsitellään siihen ja tiedosto luetaan ja kirjoitetaan servletiin.
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); } }
Koodin selitys:
Code Rivi 12–14: Tässä meidän on tuotava org.apache.commons-kirjasto koodin konfigurointiin. Meidän on tuotava fileupload-luokka org.apache.commons-kirjastosta.
Code Rivi 23: Tässä meillä on doPost()-metodi, jota kutsutaan, kun välitämme POST-metodin JSP:ssä, ja se ottaa parametreiksi pyyntö- ja vastausobjektit.
Code Rivi 26: Tässä luomme ServletFileUpload-luokan objektin org.apache.commons-kirjaston fileUpload-paketista. Objekti tarkistaa, onko JSP:ssä tiedosto-objekteja. Jos niitä löytyy, kyseiset tiedosto-objektit otetaan pyynnöstä.
Code Rivi 27–32: Käymme tiedostojen lukumäärän läpi tarkistamalla, kuinka monta tiedostoalkiota multiparts-objektissa on. Multiparts-objekti on listaobjekti (jos lataamme useamman kuin yhden tiedoston), ja tallennamme sen c:/guru/upload-kansioon annetulla tiedostonimellä. Kirjoitamme tiedoston file-objektin kirjoitusmetodilla mainittuun kansioon.
Code Rivi 34: Jos poikkeusta ei ole, asetamme pyynnössä attribuutin gurumessage arvolla ”Tiedosto ladattu onnistuneesti”.
Code Rivi 35–36: Jos poikkeus tapahtuu, annamme viestin "Tiedoston lataus epäonnistui".
Code Rivi 40: Jos tiedostoa ei löydy, asetamme viestiksi ”Tiedostoa ei löytynyt”.
Code Rivi 42: Pyynnön välittäminen result.jsp-tiedostoon requestdispatcher-objektin avulla pyyntö- ja vastausobjektien avulla.
Tulos.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>
Koodin selitys:
Code Rivi 10: Tässä haemme request-objektin attribuutin, jonka arvo on gurumessage, merkkijono-objektiin.
Code Rivi 11: Tässä tulostamme tämän viestin.
Kun suoritamme yllä olevan koodin, saamme seuraavan tulosteen:
lähtö:
Saamme lomakkeen, jossa on kenttiä tiedoston valitsemiseksi hakemistosta. Kun tiedosto on valittu, meidän on napsautettava latauspainiketta.
Kun latauspainiketta on klikattu, saamme ilmoituksen tiedoston latauksen onnistumisesta.
Alla olevasta kaaviosta näemme, että tiedosto on ladattu c:/guru/upload-kansioon.
JSP-tiedoston lataus
Tässä esimerkissä aiomme ladata tiedoston hakemistosta napsauttamalla painiketta.
Ladataan_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>
Koodin selitys:
Code Rivi 10: Tässä on linkki tiedoston lataamiseen kansiosta c:/guru/upload servlet-komennon guru_download avulla.
Guru_lataus.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 } }
Koodin selitys:
Code Rivi 3–5: Tässä tuomme FileInputStreamin, IOExceptionin ja Printin.Writer java.io-paketista.
Code Rivi 15: Määrittelemme guru_download-tiedoston servetti joka laajentaa HttpServlet.
Code Rivi 18: Kuten olemme määritelleet href-tunnisteen, joka suljetaan a-tunnisteen sisään. URL, joten GET-metodi käsitellään (doGet-metodia kutsutaan servletissä), joka sisältää myös pyyntö- ja vastausobjektit.
Code Rivi 19–20: Määritämme sisältötyypin vastausobjektissa ja haemme myös kirjoittajaobjektin vastauksesta.
Code Rivi 21–22: Muuttujan määrittely gurufile-tiedostona arvolla test.txt ja gurupath-tiedostona c:/guru/upload/.
Code Rivi 23–25: Sisältötyypin määritämme response-objektin avulla ja käytämme setHeader-metodia, joka asettaa response-objektin otsikoksi ladatun tiedostonimen.
Code Rivi 27–28: Luomme FileInputStream-tiedoston, johon lisäämme gurupath+gurufile-muuttujat.
Code Rivi 31–33: Tässä olemme ottaneet a samalla silmukka joka suoritetaan, kunnes tiedosto on luettu, joten olemme antaneet ehdon muodossa != -1. Tässä ehdossa kirjoitamme käyttämällä printwriter-objektia out.
Kun suoritat yllä olevan koodin, saat seuraavan tulosteen:
lähtö:
Meidän on napsautettava tiedostoa downloading_1.jsp, niin saamme hyperlinkin nimeltä ”Lataa tästä”. Kun napsautat tätä hyperlinkkitiedostoa, se ladataan järjestelmään.





