Ladda upp och ladda ner JSP-filer

โšก Smart sammanfattning

JSP-filuppladdning och -nedladdning รคr centrala in- och utdataoperationer som lรฅter en webbapplikation ta emot filer frรฅn anvรคndare och skicka filer tillbaka till dem. Den hรคr resursen fรถrklarar bรฅda flรถdena med hjรคlp av JSP-รฅtgรคrdsformulรคr, Apache Commons FileUpload och servletklasser, med fullstรคndig fungerande kod.

  • ๐Ÿ“ค Grunderna fรถr uppladdning: Anvรคnd POST-metoden och sรคtt enctype till multipart/form-data fรถr alla filuppladdningar.
  • ๐Ÿงฉ Apache Commons: DiskFileItemFactory och ServletFileUpload tolkar flerpartsbegรคran till filobjekt.
  • ๐Ÿ—‚๏ธ Servlethantering: doPost-metoden itererar filobjekt och skriver vart och ett till en mรฅlmapp.
  • ๐Ÿ“ฅ Nedladdningsflรถde: En servlet strรถmmar en fil med hjรคlp av FileInputStream och Content-Disposition-headern.
  • โš™๏ธ konfiguration: Filsรถkvรคgar, storleksgrรคnser och innehรฅllstyp mรฅste stรคllas in innan lรคsning eller skrivning.

Ladda upp och ladda ner JSP-filer

JSP-filuppladdning

  • Vi kan ladda upp alla filer med JSP.
  • Det kan vara en textfil, binรคr fil, bildfil eller nรฅgot annat dokument.
  • Hรคr vid filuppladdning kommer endast POST-metoden att anvรคndas och inte GET-metoden.
  • Enctype-attribut ska stรคllas in pรฅ multipart/form-data.

Exempel: Anvรคnda Action

I det hรคr exemplet laddar vi upp en fil med hjรคlp 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>

Fรถrklaring av koden:

Action_file.jsp

Code Rad 12-18: Hรคr skapar vi ett formulรคr med ett filfรคlt, som laddar upp en fil till servern, och รฅtgรคrden skickas till action_file_upload.jsp.

Action_file_upload.jsp

Code Linje 20: Hรคr anger vi filsรถkvรคgen till en specifik sรถkvรคg.

Code Rad 23-38: Hรคr kontrollerar vi om innehรฅllstypen รคr multipart/form-data. Om sรฅ รคr fallet รคr innehรฅllet av filtypen och det lรคses. Efter att filen har lรคsts skrivs den till den temporรคra filen, och sedan konverteras den temporรคra filen till huvudfilen.

Nรคr du kรถr ovanstรฅende kod fรฅr du fรถljande utdata:

JSP-filuppladdning

Produktion:

Vi laddar upp en fil med hjรคlp av alternativet "vรคlj fil", och knappen "uppladda fil" laddar upp filen till servern till den angivna sรถkvรคgen.

Exempel: Anvรคnda JSP-operationer

I det hรคr exemplet ska vi ladda upp en fil med hjรคlp av JSP-operationer. Vi anvรคnder ett formulรคr som har en "uppladdningsknapp", och nรคr du klickar pรฅ uppladdningsknappen laddas filen upp.

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>

Fรถrklaring av koden:

Code Rad 11-12: Hรคr tar vi ett formulรคr som har en รฅtgรคrd pรฅ servleten guru_upload, som kommer att passera genom en POST-metod. Attributet enctype anger ocksรฅ hรคr hur formulรคrdata ska kodas och skickas till servern, och det anvรคnds endast med POST-metoden. Hรคr stรคller vi in โ€‹โ€‹det som multipart/form-data, vilket รคr fรถr filen (eftersom datamรคngden kommer att vara stor).

Code Linje 13: Hรคr anger vi guru_file-elementet med typen file och anger storleken 50.

Code Linje 15: Detta รคr en knapp av typen "Skicka" med namnet "Ladda upp", genom vilken รฅtgรคrdsservleten anropas och begรคran bearbetas till den, och filen lรคses och skrivs till servleten.

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

		    }


}

Fรถrklaring av koden:

Code Rad 12-14: Hรคr mรฅste vi importera org.apache.commons-biblioteket till koden. Vi mรฅste importera fileupload-klassen frรฅn org.apache.commons-biblioteket.

Code Linje 23: Hรคr har vi doPost()-metoden, som kommer att anropas nรคr vi skickar POST-metoden i JSP, och den kommer att ta request- och response-objekt som sina parametrar.

Code Linje 26: Hรคr skapar vi ett objekt i ServletFileUpload-klassen frรฅn fileUpload-paketet i org.apache.commons-biblioteket, vilket kontrollerar om det finns nรฅgra filobjekt i JSP. Om nรฅgra hittas kommer dessa filobjekt att hรคmtas frรฅn begรคran.

Code Rad 27-32: Vi kommer att iterera รถver antalet filer genom att kontrollera hur mรฅnga filelement som finns i multipartsobjektet, vilket รคr ett listobjekt (om vi laddar upp mer รคn en fil), och spara det i mappen c:/guru/upload med det angivna filnamnet. Vi skriver filen med hjรคlp av write-metoden fรถr filobjektet till mappen som har nรคmnts.

Code Linje 34: Om det inte finns nรฅgot undantag, sรฅ stรคller vi in โ€‹โ€‹ett attribut i fรถrfrรฅgan som gurumessage med vรคrdet "Filen laddades upp framgรฅngsrikt".

Code Rad 35-36: Om ett undantag intrรคffar visas meddelandet โ€Filuppladdning misslyckadesโ€.

Code Linje 40: Om filen inte hittas stรคller vi in โ€‹โ€‹meddelandet som "Ingen fil hittad".

Code Linje 42: Vidarebefordrar begรคran med hjรคlp av requestdispatcher-objektet till result.jsp med request- och response-objekten.

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>

Fรถrklaring av koden:

Code Linje 10: Hรคr hรคmtar vi attributet frรฅn request-objektet med vรคrdet gurumessage till ett strรคngobjekt.

Code Linje 11: Hรคr skriver vi ut meddelandet.

Nรคr vi kรถr ovanstรฅende kod fรฅr vi fรถljande utdata:

Produktion:

Vi fรฅr upp ett formulรคr dรคr det finns fรคlt fรถr att vรคlja en fil frรฅn katalogen. Nรคr filen รคr vald mรฅste vi klicka pรฅ uppladdningsknappen.

Filuppladdning med JSP-operationer

Nรคr vi klickar pรฅ uppladdningsknappen fรฅr vi meddelandet att filen har laddats upp.

Filuppladdning med JSP-operationer

I diagrammet nedan kan vi se att filen har laddats upp till mappen c:/guru/upload.

Filuppladdning med JSP-operationer

Ladda ner JSP-fil

I det hรคr exemplet ska vi ladda ner en fil frรฅn en katalog genom att klicka pรฅ knappen.

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

Fรถrklaring av koden:

Code Linje 10: Hรคr har vi gett en lรคnk fรถr att ladda ner en fil frรฅn mappen c:/guru/upload med hjรคlp 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
	}

}

Fรถrklaring av koden:

Code Rad 3-5: Hรคr importerar vi FileInputStream, IOException och PrintWriter frรฅn java.io-paketet.

Code Linje 15: Vi definierar guru_download servlett som fรถrlรคnger HttpServlet.

Code Linje 18: Som vi har definierat en href, som kommer att omslutas av en URL, sรฅ GET-metoden kommer att bearbetas (doGet kommer att anropas i servleten), som ocksรฅ omsluter request- och response-objekt.

Code Rad 19-20: Vi anger innehรฅllstypen i svarsobjektet och hรคmtar รคven writer-objektet frรฅn svaret.

Code Rad 21-22: Definiera en variabel som gurufile med vรคrdet test.txt och gurupath som c:/guru/upload/.

Code Rad 23-25: Vi stรคller in innehรฅllstypen med hjรคlp av response-objektet och vi anvรคnder setHeader-metoden, som stรคller in headern i response-objektet som filnamnet som har laddats upp.

Code Rad 27-28: Vi skapar en FileInputStream dรคr vi kommer att lรคgga till gurupath+gurufile.

Code Rad 31-33: Hรคr har vi tagit en medan slingan vilket kommer att kรถras tills filen รคr lรคst, dรคrfรถr har vi angett villkoret != -1. I detta villkor skriver vi med hjรคlp av printwriter-objektet out.

Nรคr du kรถr ovanstรฅende kod fรฅr du fรถljande utdata:

Produktion:

Laddar ned fil

Vi mรฅste klicka pรฅ downloading_1.jsp, sรฅ fรฅr vi upp en hyperlรคnk som heter "Ladda ner hรคr". Nรคr du klickar pรฅ hyperlรคnkfilen laddas den ner till systemet.

Vanliga frรฅgor

Ja. AI-assistenter kan bygga upp servlets och JSP-formulรคr fรถr filuppladdning och nedladdning, lรคgga till Apache Commons FileUpload-logik och fรถreslรฅ validering. Du bรถr fortfarande testa koden och granska filsรถkvรคgar och storleksgrรคnser.

Ja. AI-baserade skannrar kan inspektera uppladdade filer fรถr skadlig kod, ovรคntade typer eller รถverdimensionerade nyttolaster innan de nรฅr lagring. Detta lรคgger till ett skyddslager, รคven om validering av typ och storlek pรฅ serversidan fortfarande รคr avgรถrande.

Multipart/form-data-kodningen delar upp begรคran i delar sรฅ att binรคr fildata transmitted intakt. Utan den skickar webblรคsaren bara filnamnet, inte det faktiska filinnehรฅllet, till servern.

Apache Commons FileUpload, tillsammans med Commons IO, anvรคnds flitigt. Det analyserar flerpartsfรถrfrรฅgningar, exponerar varje FileItem och skriver det uppladdade innehรฅllet till en vald katalog pรฅ servern.

Sammanfatta detta inlรคgg med: