JSP-faili üleslaadimine ja allalaadimine

⚡ Nutikas kokkuvõte

JSP-faili üleslaadimine ja allalaadimine on põhilised sisend- ja väljundoperatsioonid, mis võimaldavad veebirakendusel kasutajatelt faile vastu võtta ja neile faile tagasi saata. See ressurss selgitab mõlemat voogu JSP-toimingute vormide, Apache Commonsi FileUploadi ja servletiklasside abil koos täieliku töötava koodiga.

  • 📤 Üleslaadimise põhitõed: Kasutage POST-meetodit ja määrake faili üleslaadimisel enctype väärtuseks multipart/form-data.
  • 🧩 Apache Commons: DiskFileItemFactory ja ServletFileUpload parsivad mitmeosalise päringu failiüksusteks.
  • 🗂️ Servlettide käitlemine: Meetod doPost itereerib failiüksusi ja kirjutab igaüks neist sihtkausta.
  • 📥 Allalaadimisvoog: Servlet voogedastab faili, kasutades FileInputStreami ja Content-Disposition päist.
  • ⚙️ Konfiguratsioon: Enne lugemist või kirjutamist tuleb määrata failiteed, suurusepiirangud ja sisutüüp.

JSP-faili üleslaadimine ja allalaadimine

JSP-faili üleslaadimine

  • Saame JSP-ga üles laadida mis tahes faile.
  • See võib olla tekstifail, binaarfail, pildifail või mõni muu dokument.
  • Siin kasutatakse failide üleslaadimisel ainult POST-meetodit, mitte GET-meetodit.
  • Enctype atribuudiks tuleks määrata multipart/form-data.

Näide: toimingu kasutamine

Selles näites laadime faili üles IO-objekti abil.

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>

Koodi selgitus:

Action_file.jsp

Code Rida 12-18: Siin loome vormi failiväljaga, mis laadib faili serverisse üles ja toiming edastatakse failile action_file_upload.jsp.

Action_file_upload.jsp

Code Rida 20: Siin anname failitee konkreetsele teele.

Code Rida 23-38: Siin kontrollime, kas sisutüüp on multipart/form-data. Kui see on nii, siis on sisu failitüüpi ja seda loetakse. Pärast faili lugemist kirjutatakse see ajutisse faili ja seejärel teisendatakse ajutine fail põhifailiks.

Kui käivitate ülaltoodud koodi, saate järgmise väljundi:

JSP-faili üleslaadimine

Väljund:

Laadime faili üles valiku „Vali fail“ abil ja nupp „Laadi fail üles“ laadib faili serverisse üles antud teele.

Näide: JSP-operatsioonide kasutamine

Selles näites laadime faili üles JSP-operatsioonide abil. Võtame vormi, millel on nupp „Laadi üles” ja kui klõpsate üleslaadimisnupul, laaditakse fail üles.

Üleslaadimine_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>

Koodi selgitus:

Code Rida 11-12: Siin võtame vormi, millel on toiming servletil guru_upload, mis läbib POST-meetodi. Samuti määrab siin atribuut enctype, kuidas vormi andmeid tuleks kodeerida ja serverisse saata, ning seda kasutatakse ainult POST-meetodiga. Siin määrame selle multipart/form-data-ks, mis on faili jaoks (kuna andmed on suured).

Code Rida 13: Siin määrame guru_file elemendi tüübiks „fail“ ja suuruseks 50.

Code Rida 15: See on saatmistüüpi nupp nimega „Laadi üles“, mille kaudu kutsutakse välja toiminguservlett, mis töötleb päringu ning loeb ja kirjutab faili servletti.

Guru_üleslaadimine.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);

		    }


}

Koodi selgitus:

Code Rida 12-14: Siin peame importima org.apache.commonsi teegi koodi konfiguratsiooni. Peame importima fileupload klassi org.apache.commonsi teegist.

Code Rida 23: Siin on meil meetod doPost(), mida kutsutakse JSP-s POST-meetodi edastamisel ning mis võtab parameetriteks päringu- ja vastuseobjektid.

Code Rida 26: Siin loome org.apache.commonsi teegi fileUpload paketist ServletFileUpload klassi objekti, mis kontrollib, kas JSP-s on failiobjekte. Kui neid leitakse, võetakse need failiobjektid päringust.

Code Rida 27-32: Me itereerime failide arvu, kontrollides, mitu failiüksust on multiparts-objektis, mis on loendiobjekt (kui laadime üles rohkem kui ühe faili), ja salvestame selle kausta c:/guru/upload antud failinimega. Kirjutame faili failiobjekti write-meetodi abil mainitud kausta.

Code Rida 34: Kui erandeid pole, määrame päringule atribuudi gurumessage väärtusega „Fail edukalt üles laaditud”.

Code Rida 35-36: Erandi ilmnemisel kuvatakse teade „Faili üleslaadimine ebaõnnestus”.

Code Rida 40: Kui faili ei leita, siis määrame teateks „Faili ei leitud”.

Code Rida 42: Päringu edastamine requestdispatcher objekti abil result.jsp faili koos päringu ja vastuse objektidega.

Tulemus.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>

Koodi selgitus:

Code Rida 10: Siin saame päringuobjekti atribuudi väärtusega gurumessage stringobjekti.

Code Rida 11: Siin me trükime selle sõnumi.

Kui käivitame ülaltoodud koodi, saame järgmise väljundi:

Väljund:

Saame vormi, kus on väljad faili valimiseks kataloogist. Kui fail on valitud, peame klõpsama üleslaadimise nuppu.

Failide üleslaadimine JSP-operatsioonide abil

Kui oleme klõpsanud üleslaadimisnupul, saame teate, et fail on edukalt üles laaditud.

Failide üleslaadimine JSP-operatsioonide abil

Alloleval diagrammil näeme, et fail on üles laaditud kausta c:/guru/upload.

Failide üleslaadimine JSP-operatsioonide abil

JSP-faili allalaadimine

Selles näites laadime faili kataloogist alla, klõpsates nuppu.

Allalaadimine_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>

Koodi selgitus:

Code Rida 10: Siin on link faili allalaadimiseks kaustast c:/guru/upload servleti guru_download abil.

Guru_allalaadimine.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
	}

}

Koodi selgitus:

Code Rida 3-5: Siin impordime FileInputStreami, IOExceptioni ja Printi.Writer java.io paketist.

Code Rida 15: Me defineerime guru_download faili servett mis laiendab HttpServleti.

Code Rida 18: Nagu me oleme href'i defineerinud, lisatakse see a-sse URL, seega töödeldakse GET-meetodit (servletis kutsutakse välja doGet), mis sisaldab ka päringu- ja vastuseobjekte.

Code Rida 19-20: Me määrame sisutüübi vastuseobjektis ja saame vastusest ka kirjutajaobjekti.

Code Rida 21-22: Muutuja defineerimine gurufile'ina väärtusega test.txt ja gurupath väärtusega c:/guru/upload/.

Code Rida 23-25: Sisutüübi määrame vastuseobjekti abil ja kasutame meetodit setHeader, mis määrab vastuseobjekti päise üleslaaditud failinimena.

Code Rida 27-28: Loome FileInputStreami, kuhu lisame gurupath+gurufile.

Code Rida 31-33: Siin oleme võtnud a samas silmus mis töötab kuni faili lugemiseni, seega oleme andnud tingimuse != -1. Selles tingimuses kirjutame printwriter objekti out abil.

Ülaltoodud koodi käivitamisel saate järgmise väljundi:

Väljund:

Faili allalaadimine

Peame klõpsama failil downloading_1.jsp ja me saame hüperlingi nimega „Laadi siit alla“. Sellel hüperlingifailil klõpsamisel laaditakse see süsteemi alla.

KKK

Jah. Tehisintellekti assistendid saavad failide üles- ja allalaadimiseks servlette ja JSP-vorme tugistruktuuridesse paigutada, lisada Apache Commonsi FileUploadi loogikat ja soovitada valideerimist. Peaksite siiski koodi testima ning failide teid ja suurusepiiranguid üle vaatama.

Jah. Tehisintellektil põhinevad skannerid saavad üleslaaditud faile enne salvestusruumi jõudmist kontrollida pahavara, ootamatute tüüpide või liiga suurte koormuste suhtes. See lisab kaitsekihi, kuigi serveripoolne tüübi ja suuruse valideerimine on endiselt oluline.

Mitmeosaline/vormiandmete kodeering jagab päringu osadeks, seega on binaarfaili andmed transmitted puutumata. Ilma selleta saadab brauser serverile ainult failinime, mitte faili tegelikku sisu.

Apache Commons FileUploadi kasutatakse koos Commons IO-ga laialdaselt. See parsib mitmeosalisi päringuid, avaldab iga FileItemi ja kirjutab üleslaaditud sisu serveri valitud kataloogi.

Võta see postitus kokku järgmiselt: