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.

  • 📤 Latauksen perusteet: Käytä POST-metodia ja aseta enctype-arvoksi multipart/form-data kaikkia tiedostojen latauskertoja varten.
  • 🧩 Apache Commons: DiskFileItemFactory ja ServletFileUpload jäsentävät moniosaisen pyynnön tiedostonimikkeiksi.
  • 🗂️ Servlettien käsittely: doPost-metodi iteroi tiedostoelementtejä ja kirjoittaa jokaisen kohdekansioon.
  • 📥 Latausprosessi: Servlet suoratoistaa tiedostoa käyttämällä FileInputStream-metodia ja Content-Disposition-otsaketta.
  • ⚙️ kokoonpano: Tiedostopolut, kokorajoitukset ja sisältötyyppi on asetettava ennen lukemista tai kirjoittamista.

JSP-tiedoston lataus ja lataus

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:

JSP-tiedoston lataus

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.

Tiedoston lataaminen JSP-toimintojen avulla

Kun latauspainiketta on klikattu, saamme ilmoituksen tiedoston latauksen onnistumisesta.

Tiedoston lataaminen JSP-toimintojen avulla

Alla olevasta kaaviosta näemme, että tiedosto on ladattu c:/guru/upload-kansioon.

Tiedoston lataaminen JSP-toimintojen avulla

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ö:

Ladataan tiedostoa

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.

UKK

Kyllä. Tekoälyavustajat voivat tukea servlettejä ja JSP-lomakkeita tiedostojen lataamiseen ja lähettämiseen, lisätä Apache Commons FileUpload -logiikkaa ja ehdottaa validointia. Sinun tulisi silti testata koodi ja tarkistaa tiedostopolut ja kokorajoitukset.

Kyllä. Tekoälyyn perustuvat skannerit voivat tarkistaa ladatut tiedostot haittaohjelmien, odottamattomien tyyppien tai ylisuurten hyötykuormien varalta ennen kuin ne päätyvät tallennustilaan. Tämä lisää suojauskerroksen, vaikka palvelimen puolen tyypin ja koon validointi on edelleen välttämätöntä.

Moniosaisen/lomakedatan koodaus jakaa pyynnön osiin, joten binääritiedostodata on transmitted ehjä. Ilman sitä selain lähettää palvelimelle vain tiedostonimen, ei varsinaista tiedostosisältöä.

Apache Commons FileUpload yhdessä Commons IO:n kanssa on laajalti käytössä. Se jäsentää moniosaisia ​​pyyntöjä, paljastaa jokaisen FileItemin ja kirjoittaa ladatun sisällön valittuun hakemistoon palvelimella.

Tiivistä tämä viesti seuraavasti: