JSP-filopplasting og nedlasting

⚡ Smart oppsummering

JSP-filopplasting og -nedlasting er sentrale input- og output-operasjoner som lar en webapplikasjon motta filer fra brukere og levere filer tilbake til dem. Denne ressursen forklarer begge flytene ved hjelp av JSP-handlingsskjemaer, Apache Commons FileUpload og servlet-klasser, med fullstendig fungerende kode.

  • 📤 Grunnleggende om opplasting: Bruk POST-metoden og sett enctype til multipart/form-data for alle filopplastinger.
  • 🧩 Apache Commons: DiskFileItemFactory og ServletFileUpload analyserer flerdelsforespørselen til filelementer.
  • 🗂️ Servlet-håndtering: doPost-metoden iterererer filelementer og skriver hvert element til en målmappe.
  • 📥 Nedlastingsflyt: En servlet strømmer en fil ved hjelp av FileInputStream og Content-Disposition-headeren.
  • ⚙️ konfigurasjon: Filstier, størrelsesgrenser og innholdstype må angis før lesing eller skriving.

JSP-filopplasting og nedlasting

JSP-filopplasting

  • Vi kan laste opp alle filer ved hjelp av JSP.
  • Det kan være en tekstfil, binær fil, bildefil eller et hvilket som helst annet dokument.
  • Her ved filopplasting vil kun POST-metoden brukes og ikke GET-metoden.
  • Enctype-attributt bør settes til multipart/form-data.

Eksempel: Bruk av handling

I dette eksemplet laster vi opp en fil ved hjelp av IO-objektet.

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>

Forklaring av koden:

Action_file.jsp

Code Linje 12-18: Her lager vi et skjema med et filfelt, som laster opp en fil til serveren, og handlingen sendes til action_file_upload.jsp.

Action_file_upload.jsp

Code Linje 20: Her gir vi filstien til en bestemt bane.

Code Linje 23-38: Her sjekker vi om innholdstypen er flerdelt/skjema-data. Hvis det er tilfelle, er innholdet av filtypen, og det leses. Etter at filen er lest, skrives den inn i den midlertidige filen, og deretter konverteres den midlertidige filen til hovedfilen.

Når du kjører koden ovenfor, får du følgende utgang:

JSP-filopplasting

Utgang:

Vi laster opp en fil ved hjelp av alternativet «velg fil»-knappen, og «last opp fil»-knappen laster opp filen til serveren til den oppgitte banen.

Eksempel: Bruk av JSP-operasjoner

I dette eksemplet skal vi laste opp en fil ved hjelp av JSP-operasjoner. Vi bruker et skjema som har en «last opp»-knapp, og når du klikker på opplastingsknappen, lastes filen opp.

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

Forklaring av koden:

Code Linje 11-12: Her tar vi et skjema som har en handling på servleten guru_upload, som vil gå gjennom en POST-metode. Her spesifiserer også enctype-attributtet hvordan skjemadata skal kodes og sendes til serveren, og det brukes bare med POST-metoden. Her setter vi det som multipart/form-data, som er for filen (siden dataene vil være store).

Code Linje 13: Her spesifiserer vi guru_file-elementet med typen fil og oppgir størrelsen 50.

Code Linje 15: Dette er en send-knapp med navnet «Last opp», som handlingsservleten kalles gjennom, og forespørselen behandles der, og filen leses og skrives inn i servleten.

Guru_opplasting.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);

		    }


}

Forklaring av koden:

Code Linje 12-14: Her må vi importere org.apache.commons-biblioteket inn i kodekonfigurasjonen. Vi må importere fileupload-klassen fra org.apache.commons-biblioteket.

Code Linje 23: Her har vi doPost()-metoden, som vil bli kalt når vi sender POST-metoden i JSP, og den vil ta forespørsels- og svarobjekter som parametere.

Code Linje 26: Her oppretter vi et objekt av ServletFileUpload-klassen fra fileUpload-pakken i org.apache.commons-biblioteket, som vil sjekke om det finnes noen filobjekter i JSP. Hvis noen blir funnet, vil disse filobjektene bli hentet fra forespørselen.

Code Linje 27-32: Vi vil iterere over antall filer ved å sjekke hvor mange filelementer som finnes i flerpartsobjektet, som er et listeobjekt (hvis vi laster opp mer enn én fil), og lagre det i c:/guru/upload-mappen med filnavnet som er oppgitt. Vi skriver filen ved hjelp av skrivemetoden til filobjektet inn i mappen som er nevnt.

Code Linje 34: Hvis det ikke er noe unntak, setter vi et attributt i forespørselen som gurumessage med verdien «Filen er lastet opp».

Code Linje 35-36: Hvis det oppstår et unntak, setter vi en melding om at «Filopplasting mislyktes».

Code Linje 40: Hvis filen ikke finnes, setter vi meldingen som «Ingen fil funnet».

Code Linje 42: Videresender forespørselen ved hjelp av requestdispatcher-objektet til result.jsp med request- og response-objekter.

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

Forklaring av koden:

Code Linje 10: Her henter vi attributtet fra forespørselsobjektet med verdien gurumessage inn i et strengobjekt.

Code Linje 11: Her trykker vi den meldingen.

Når vi kjører koden ovenfor, får vi følgende utgang:

Utgang:

Vi får opp et skjema der det er felt for å velge en fil fra katalogen. Når filen er valgt, må vi klikke på opplastingsknappen.

Filopplasting ved hjelp av JSP-operasjoner

Når vi klikker på opplastingsknappen, får vi meldingen om at filen er lastet opp.

Filopplasting ved hjelp av JSP-operasjoner

I diagrammet nedenfor kan vi se at filen ble lastet opp til c:/guru/upload-mappen.

Filopplasting ved hjelp av JSP-operasjoner

Last ned JSP-fil

I dette eksemplet skal vi laste ned en fil fra en katalog ved å klikke på knappen.

Laster ned_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>

Forklaring av koden:

Code Linje 10: Her har vi gitt en lenke for å laste ned en fil fra mappen c:/guru/upload ved hjelp av servleten 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
	}

}

Forklaring av koden:

Code Linje 3-5: Her importerer vi FileInputStream, IOException og PrintWriter fra java.io-pakken.

Code Linje 15: Vi definerer guru_download servlett som utvider HttpServlet.

Code Linje 18: Som vi har definert en href, som vil bli omsluttet av en URL, slik at GET-metoden blir behandlet (doGet vil bli kalt i servleten), som også omslutter forespørsels- og svarobjekter.

Code Linje 19-20: Vi angir innholdstypen i response-objektet og henter også writer-objektet fra responsen.

Code Linje 21-22: Definerer en variabel som gurufile med verdien test.txt og gurupath som c:/guru/upload/.

Code Linje 23-25: Vi angir innholdstypen ved hjelp av response-objektet, og vi bruker setHeader-metoden, som setter headeren i response-objektet som filnavnet som er lastet opp.

Code Linje 27-28: Vi lager en FileInputStream der vi legger til gurupath+gurufile.

Code Linje 31-33: Her har vi tatt en mens løkken som vil kjøre til filen er lest, derfor har vi gitt betingelsen som != -1. I denne betingelsen skriver vi ved hjelp av printwriter-objektet out.

Når du kjører koden ovenfor, får du følgende utdata:

Utgang:

Laster ned fil

Vi må klikke på downloading_1.jsp, og vi vil få opp en hyperkobling som heter «Last ned her». Når du klikker på denne hyperkoblingsfilen, vil den lastes ned til systemet.

Spørsmål og svar

Ja. AI-assistenter kan sette opp servleter og JSP-skjemaer for filopplasting og -nedlasting, legge til Apache Commons FileUpload-logikk og foreslå validering. Du bør fortsatt teste koden og gjennomgå filstier og størrelsesgrenser.

Ja. AI-baserte skannere kan inspisere opplastede filer for skadelig programvare, uventede typer eller store nyttelaster før de når lagring. Dette legger til et lag med beskyttelse, selv om validering av type og størrelse på serversiden fortsatt er viktig.

Multipart/form-data-kodingen deler forespørselen inn i deler, slik at binære fildata blir transmitted intakt. Uten den sender nettleseren bare filnavnet, ikke det faktiske filinnholdet, til serveren.

Apache Commons FileUpload, sammen med Commons IO, er mye brukt. Den analyserer flerdelte forespørsler, eksponerer hvert FileItem og skriver det opplastede innholdet til en valgt katalog på serveren.

Oppsummer dette innlegget med: