Prijenos i preuzimanje JSP datoteke

⚡ Pametni sažetak

Prijenos i preuzimanje JSP datoteka su osnovne ulazne i izlazne operacije koje omogućuju web aplikaciji primanje datoteka od korisnika i njihovo vraćanje. Ovaj resurs objašnjava oba toka korištenjem JSP obrazaca za akcije, Apache Commons FileUploada i servlet klasa, s cjelovitim radnim kodom.

  • 📤 Osnove prijenosa: Koristite POST metodu i postavite enctype na multipart/form-data za bilo koji prijenos datoteke.
  • 🧩 Apache Commons: DiskFileItemFactory i ServletFileUpload parsiraju višedijelni zahtjev u datoteke stavki.
  • 🗂️ Rukovanje servletima: Metoda doPost iterira stavke datoteke i svaku zapisuje u ciljnu mapu.
  • 📥 Tijek preuzimanja: Servlet struji datoteku koristeći FileInputStream i zaglavlje Content-Disposition.
  • konfiguracija: Putanje datoteka, ograničenja veličine i vrsta sadržaja moraju se postaviti prije čitanja ili pisanja.

Prijenos i preuzimanje JSP datoteke

Prijenos JSP datoteke

  • Možemo učitati bilo koje datoteke pomoću JSP-a.
  • To može biti tekstualna datoteka, binarna datoteka, slikovna datoteka ili bilo koji drugi dokument.
  • Ovdje će se u slučaju učitavanja datoteke koristiti samo POST metoda, a ne GET metoda.
  • Enctype atribut bi trebao biti postavljen na multipart/form-data.

Primjer: Korištenje akcije

U ovom primjeru učitavamo datoteku pomoću IO objekta.

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>

Objašnjenje koda:

Action_file.jsp

Code Redak 12-18: Ovdje stvaramo obrazac s poljem datoteke koje će prenijeti datoteku na poslužitelj, a akcija će biti proslijeđena na action_file_upload.jsp.

Action_file_upload.jsp

Code Redak 20: Ovdje dajemo putanju datoteke do određene putanje.

Code Redak 23-38: Ovdje provjeravamo je li tip sadržaja multipart/form-data. Ako je to slučaj, tada je sadržaj tipa datoteke i čita se. Nakon što je datoteka pročitana, zapisuje se u privremenu datoteku, a zatim se privremena datoteka pretvara u glavnu datoteku.

Kada izvršite gornji kod, dobit ćete sljedeći izlaz:

Prijenos JSP datoteke

Izlaz:

Datoteku prenosimo pomoću opcije gumba za odabir datoteke, a gumb za prijenos datoteke prenijet će datoteku na poslužitelj na navedenu putanju.

Primjer: korištenje JSP operacija

U ovom primjeru, prenijet ćemo datoteku koristeći JSP operacije. Uzet ćemo obrazac koji će imati gumb "prenesi" i kada kliknete na gumb za prenesi, datoteka će se prenijeti.

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

Objašnjenje koda:

Code Redak 11-12: Ovdje uzimamo obrazac koji ima akciju na servletu guru_upload, koja će proći kroz POST metodu. Također, ovdje atribut enctype određuje kako se podaci obrasca trebaju kodirati i slati na poslužitelj, a koristi se samo s POST metodom. Ovdje ga postavljamo kao multipart/form-data, što je za datoteku (jer će podaci biti veliki).

Code Redak 13: Ovdje specificiramo element guru_file tipa file i dajemo veličinu 50.

Code Redak 15: Ovo je gumb tipa slanja s nazivom "Upload" (Prenesi), putem kojeg će se pozvati servlet akcije i zahtjev će se obraditi u njega, a datoteka će se pročitati i zapisati u 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);

		    }


}

Objašnjenje koda:

Code Redak 12-14: Ovdje ćemo morati uvesti biblioteku org.apache.commons u konfiguraciju koda. Morat ćemo uvesti klasu fileupload iz biblioteke org.apache.commons.

Code Redak 23: Ovdje imamo metodu doPost() koja će se pozvati dok prosljeđujemo POST metodu u JSP-u, a kao parametre će uzimati objekte zahtjeva i odgovora.

Code Redak 26: Ovdje stvaramo objekt klase ServletFileUpload iz paketa fileUpload biblioteke org.apache.commons, koji će provjeriti postoje li objekti datoteka u JSP-u. Ako se pronađu, ti će se objekti datoteka uzeti iz zahtjeva.

Code Redak 27-32: Ponavljat ćemo broj datoteka provjeravajući koliko se stavki datoteke nalazi u objektu tipa multiparts, koji je objekt liste (ako prenesemo više od jedne datoteke), i spremiti ga u mapu c:/guru/upload s navedenim nazivom datoteke. Datoteku zapisujemo pomoću metode write objekta datoteke u spomenutu mapu.

Code Redak 34: Ako nema iznimke, tada u zahtjevu postavljamo atribut kao gurumessage s vrijednošću „Datoteka uspješno prenesena“.

Code Redak 35-36: Ako se dogodi iznimka, postavljamo poruku da „Prijenos datoteke nije uspio“.

Code Redak 40: Ako datoteka nije pronađena, tada postavljamo poruku kao „Datoteka nije pronađena“.

Code Redak 42: Prosljeđivanje zahtjeva pomoću objekta requestdispatcher na result.jsp s objektima request i response.

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

Objašnjenje koda:

Code Redak 10: Ovdje dobivamo atribut iz objekta zahtjeva s vrijednošću gurumessage u objekt string.

Code Redak 11: Ovdje ispisujemo tu poruku.

Kada izvršimo gornji kod, dobivamo sljedeći izlaz:

Izlaz:

Dobivamo obrazac u kojem postoje polja za odabir datoteke iz direktorija. Nakon što je datoteka odabrana, moramo kliknuti na gumb za prijenos.

Prijenos datoteke korištenjem JSP operacija

Nakon što kliknemo na gumb za prijenos, dobivamo poruku da je datoteka uspješno prenesena.

Prijenos datoteke korištenjem JSP operacija

Na donjem dijagramu možemo vidjeti da je datoteka prenesena u mapu c:/guru/upload.

Prijenos datoteke korištenjem JSP operacija

Preuzimanje JSP datoteke

U ovom primjeru ćemo preuzeti datoteku iz direktorija klikom na gumb.

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

Objašnjenje koda:

Code Redak 10: Ovdje smo dali poveznicu za preuzimanje datoteke iz mape c:/guru/upload pomoću servleta 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
	}

}

Objašnjenje koda:

Code Redak 3-5: Ovdje uvozimo FileInputStream, IOException i Print.Writer iz paketa java.io.

Code Redak 15: Definiramo guru_download servlet koji proširuje HttpServlet.

Code Redak 18: Kao što smo definirali href, koji će biti zatvoren u URL, pa će se obraditi GET metoda (doGet će se pozvati u servletu), koja također obuhvaća objekte zahtjeva i odgovora.

Code Redak 19-20: Postavljamo tip sadržaja u objektu odgovora i također dobivamo objekt pisanja iz odgovora.

Code Redak 21-22: Definiranje varijable kao gurufile s vrijednošću test.txt i gurupath kao c:/guru/upload/.

Code Redak 23-25: Tip sadržaja postavljamo pomoću objekta odgovora i koristimo metodu setHeader koja postavlja zaglavlje u objekt odgovora kao naziv datoteke koja je prenesena.

Code Redak 27-28: Izrađujemo FileInputStream u koji ćemo dodati gurupath+gurufile.

Code Redak 31-33: Ovdje smo uzeli a dok petlje koji će se izvršavati dok se datoteka ne pročita, stoga smo uvjet zadali kao != -1. U ovom uvjetu pišemo pomoću objekta printwriter.

Kada izvršite gornji kod, dobit ćete sljedeći izlaz:

Izlaz:

Preuzimanje datoteke

Moramo kliknuti na downloading_1.jsp i dobit ćemo hipervezu kao "Preuzmi ovdje". Kada kliknete na ovu datoteku hiperveze, ona će se preuzeti u sustav.

Pitanja i odgovori

Da. AI asistenti mogu izraditi scaffold servlete i JSP obrasce za prijenos i preuzimanje datoteka, dodati logiku Apache Commons FileUpload i predložiti validaciju. I dalje biste trebali testirati kod i pregledati putanje datoteka i ograničenja veličine.

Da. Skeneri temeljeni na umjetnoj inteligenciji mogu pregledati prenesene datoteke u potrazi za zlonamjernim softverom, neočekivanim vrstama ili prevelikim korisnim sadržajima prije nego što stignu u pohranu. To dodaje sloj zaštite, iako je validacija vrste i veličine na strani poslužitelja i dalje bitna.

Kodiranje višedijelnih/form-data dijeli zahtjev na dijelove tako da su binarni podaci datoteke transmitted netaknut. Bez njega, preglednik šalje poslužitelju samo naziv datoteke, a ne stvarni sadržaj datoteke.

Apache Commons FileUpload, zajedno s Commons IO-om, široko se koristi. On analizira višedijelne zahtjeve, izlaže svaku stavku datoteke (FileItem) i zapisuje preneseni sadržaj u odabrani direktorij na poslužitelju.

Sažmite ovu objavu uz: