JSP-fil upload og download

โšก Smart opsummering

JSP-filupload og -download er centrale input- og output-operationer, der giver en webapplikation mulighed for at modtage filer fra brugere og sende filer tilbage til dem. Denne ressource forklarer begge flows ved hjรฆlp af JSP-handlingsformularer, Apache Commons FileUpload og servlet-klasser med komplet fungerende kode.

  • ๐Ÿ“ค Grundlรฆggende om upload: Brug POST-metoden og indstil enctype til multipart/form-data for enhver filupload.
  • ๐Ÿงฉ Apache Commons: DiskFileItemFactory og ServletFileUpload parser flerdelsanmodningen til filelementer.
  • ๐Ÿ—‚๏ธ Servlet-hรฅndtering: doPost-metoden itererer filelementer og skriver hvert element til en destinationsmappe.
  • ๐Ÿ“ฅ Downloadflow: En servlet streamer en fil ved hjรฆlp af FileInputStream og Content-Disposition-headeren.
  • ๐Ÿ‡ง๐Ÿ‡ท Konfiguration: Filstier, stรธrrelsesgrรฆnser og indholdstype skal indstilles fรธr lรฆsning eller skrivning.

JSP-fil upload og download

JSP fil upload

  • Vi kan uploade alle filer ved hjรฆlp af JSP.
  • Det kan vรฆre en tekstfil, binรฆr fil, billedfil eller et hvilket som helst andet dokument.
  • Her i tilfรฆlde af filupload vil kun POST-metoden blive brugt og ikke GET-metoden.
  • Enctype-attribut skal indstilles til multipart/form-data.

Eksempel: Brug af handling

I dette eksempel uploader vi en fil ved hjรฆlp af et IO-objekt.

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 af koden:

Action_file.jsp

Code Linje 12-18: Her opretter vi en formular med et filfelt, som vil uploade en fil til serveren, og handlingen vil blive sendt til action_file_upload.jsp.

Action_file_upload.jsp

Code Linje 20: Her angiver vi filstien til en bestemt sti.

Code Linje 23-38: Her kontrollerer vi, om indholdstypen er multipart/form-data. Hvis det er tilfรฆldet, er indholdet af filtypen, og det lรฆses. Nรฅr filen er lรฆst, skrives den til den midlertidige fil, og derefter konverteres den midlertidige fil til hovedfilen.

Nรฅr du udfรธrer ovenstรฅende kode, fรฅr du fรธlgende output:

JSP fil upload

Output:

Vi uploader en fil ved hjรฆlp af knappen "Vรฆlg fil", og knappen "Upload fil" uploader filen til serveren til den angivne sti.

Eksempel: Brug af JSP-operationer

I dette eksempel skal vi uploade en fil ved hjรฆlp af JSP-operationer. Vi bruger en formular med en "upload"-knap, og nรฅr du klikker pรฅ upload-knappen, bliver filen uploadet.

Uploader_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 af koden:

Code Linje 11-12: Her tager vi en formular, der har en handling pรฅ servlet'en guru_upload, som vil passere gennem en POST-metode. Her specificerer attributten enctype ogsรฅ, hvordan formulardata skal kodes og sendes til serveren, og den bruges kun med POST-metoden. Her indstiller vi den som multipart/form-data, hvilket er for filen (da dataene vil vรฆre store).

Code Linje 13: Her angiver vi guru_file-elementet med typen file og angiver stรธrrelsen 50.

Code Linje 15: Dette er en send-knap med navnet "Upload", hvorigennem handlingsservlet'en kaldes, anmodningen behandles i den, og filen lรฆses og skrives til servlet'en.

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

		    }


}

Forklaring af koden:

Code Linje 12-14: Her skal vi importere org.apache.commons-biblioteket ind i kodekonfigurationen. Vi skal importere fileupload-klassen fra org.apache.commons-biblioteket.

Code Linje 23: Her har vi doPost()-metoden, som kaldes, nรฅr vi sender POST-metoden i JSP, og den tager request- og response-objekter som parametre.

Code Linje 26: Her opretter vi et objekt af ServletFileUpload-klassen fra fileUpload-pakken i org.apache.commons-biblioteket, som vil kontrollere, om der er nogen filobjekter i JSP. Hvis der findes nogen, vil disse filobjekter blive taget fra anmodningen.

Code Linje 27-32: Vi vil iterere over antallet af filer ved at kontrollere, hvor mange filelementer der er til stede i multiparts-objektet, som er et listeobjekt (hvis vi uploader mere end รฉn fil), og gemme det i c:/guru/upload-mappen med det angivne filnavn. Vi skriver filen ved hjรฆlp af skrivemetoden for file-objektet til den nรฆvnte mappe.

Code Linje 34: Hvis der ikke er nogen undtagelse, sรฆtter vi en attribut i anmodningen som gurumessage med vรฆrdien "Filen er uploadet".

Code Linje 35-36: Hvis der opstรฅr en undtagelse, viser vi en meddelelse om, at "Filupload mislykkedes".

Code Linje 40: Hvis filen ikke findes, sรฆtter vi meddelelsen til "Ingen fil fundet".

Code Linje 42: Videresendelse af anmodningen ved hjรฆlp af 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 af koden:

Code Linje 10: Her henter vi attributten fra request-objektet med vรฆrdien gurumessage ind i et strengobjekt.

Code Linje 11: Her udskriver vi den besked.

Nรฅr vi udfรธrer ovenstรฅende kode, fรฅr vi fรธlgende output:

Output:

Vi fรฅr en formular, hvor der er felter til at vรฆlge en fil fra mappen. Nรฅr filen er valgt, skal vi klikke pรฅ upload-knappen.

Filoverfรธrsel ved hjรฆlp af JSP-operationer

Nรฅr vi klikker pรฅ upload-knappen, fรฅr vi beskeden om, at filen er uploadet.

Filoverfรธrsel ved hjรฆlp af JSP-operationer

I diagrammet nedenfor kan vi se, at filen er blevet uploadet til mappen c:/guru/upload.

Filoverfรธrsel ved hjรฆlp af JSP-operationer

Download JSP fil

I dette eksempel skal vi downloade en fil fra en mappe ved at klikke pรฅ knappen.

Downloader_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 af koden:

Code Linje 10: Her har vi givet et link til at downloade en fil fra mappen c:/guru/upload ved hjรฆlp af servlet'en 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 af koden:

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

Code Linje 15: Vi definerer guru_download servlet som udvider HttpServlet.

Code Linje 18: Som vi har defineret en href, som vil vรฆre omsluttet af en URL, sรฅ GET-metoden vil blive behandlet (doGet vil blive kaldt i servlet'en), som ogsรฅ omslutter anmodnings- og svarobjekter.

Code Linje 19-20: Vi indstiller indholdstypen i response-objektet og henter ogsรฅ writer-objektet fra responsen.

Code Linje 21-22: Definering af en variabel som gurufile med vรฆrdien test.txt og gurupath som c:/guru/upload/.

Code Linje 23-25: Vi indstiller indholdstypen ved hjรฆlp af response-objektet, og vi bruger setHeader-metoden, som indstiller headeren i response-objektet som det filnavn, der er blevet uploadet.

Code Linje 27-28: Vi opretter en FileInputStream, hvor vi vil tilfรธje gurupath+gurufile.

Code Linje 31-33: Her har vi taget en mens lรธkke som vil kรธre indtil filen er lรฆst, derfor har vi givet betingelsen != -1. I denne betingelse skriver vi ved hjรฆlp af printwriter-objektet out.

Nรฅr du udfรธrer ovenstรฅende kode, fรฅr du fรธlgende output:

Output:

Downloader fil

Vi skal klikke pรฅ downloading_1.jsp, og vi fรฅr et hyperlink som "Download her". Nรฅr du klikker pรฅ denne hyperlinkfil, downloades den til systemet.

Ofte Stillede Spรธrgsmรฅl

Ja. AI-assistenter kan scaffolde servlets og JSP-formularer til filupload og -download, tilfรธje Apache Commons FileUpload-logik og foreslรฅ validering. Du bรธr stadig teste koden og gennemgรฅ filstier og stรธrrelsesgrรฆnser.

Ja. AI-baserede scannere kan inspicere uploadede filer for malware, uventede typer eller overdimensionerede nyttelaster, fรธr de nรฅr lagerpladsen. Dette tilfรธjer et lag af beskyttelse, selvom validering af type og stรธrrelse pรฅ serversiden stadig er afgรธrende.

Multipart/form-data-kodningen opdeler anmodningen i dele, sรฅ binรฆre fildata er transmitintakt. Uden den sender browseren kun filnavnet, ikke det faktiske filindhold, til serveren.

Apache Commons FileUpload er, sammen med Commons IO, meget udbredt. Det analyserer flerdelte anmodninger, eksponerer hvert FileItem og skriver det uploadede indhold til en valgt mappe pรฅ serveren.

Opsummer dette indlรฆg med: