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: