JSP-fil upload og download

I dette eksempel skal vi lรฆre om upload og download af en fil via JSP.

Filinput output er meget vigtige operationer. Her skal vi lรฆse og skrive en fil ved hjรฆlp af JSP.

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

Kodelinje 12-18: Her opretter vi formular med filfelt, som uploader filen til serveren og handlingen vil blive videregivet til action_file_upload.jsp

Action_file_upload.jsp

Kodelinje 20: Her giver vi filstien til en bestemt sti

Kodelinje 23-38: Her tjekker vi om indholdstypen er multipart/form-data. Hvis det er tilfรฆldet, sรฅ er indholdet af filtype, og det lรฆses. Efter at filen er lรฆst, skrives den ind i den midlertidige fil, og derefter bliver den midlertidige fil konverteret til hovedfilen.

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

JSP fil upload

Output:

Vi uploader fil ved at bruge vรฆlg fil-knap-indstillingen, og upload-fil-knappen vil uploade filen til serveren til stien, som er angivet.

Eksempel: Brug af JSP-operationer

I dette eksempel skal vi uploade en fil ved hjรฆlp af JSP-operationer. Vi tager en formular, som vil have "upload"-knap, og nรฅr du klikker pรฅ upload-knappen, vil filen blive 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:

Kodelinje 11-12: Her tager vi en formular, som har handling pรฅ servlet guru_upload, som vil passere gennem en metode POST. Her enctype vi ogsรฅ, dvs. attribut, som specificerer, hvordan formulardata skal kodes og sendes til serveren, og det bruges kun med POST-metoden. Her sรฆtter vi som multipart/form-data, som er for filen (da data vil vรฆre store).

Kodelinje 13: Her specificerer vi guru_file element med type fil og giver stรธrrelse som 50.

Kodelinje 15: Dette er en submit type-knap med navnet "Upload" pรฅ den, gennem hvilken handlingsservlet vil blive kaldt, og anmodningen vil blive behandlet til den, og filen vil blive lรฆst og skrevet ind i 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);
		
		    }


}

Forklaring af koden:

Kodelinje 12-14: Her bliver vi nรธdt til at importere org.apache.commons-biblioteket til konfigurationen af โ€‹โ€‹koden. Vi bliver nรธdt til at importere filupload-klassen fra org.apache.commons-biblioteket.

Kodelinje 23: Her har vi doPost()-metoden, som vil blive kaldt, nรฅr vi sender POST-metoden i JSP, og den vil anmode om og svare pรฅ objekter som dens parametre

Kodelinje 26: Her opretter vi et objekt af ServletFileUpload-klassen fra fileUpload-pakken fra 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.

Kodelinje 27-32: Vi gentager antallet af filer ved at kontrollere, hvor mange filelementer der er til stede i multiparts-objekt, som er et listeobjekt (hvis vi uploader mere end รฉn fil) og gemmer det i c:/guru/upload-mappen med det filnavn, der er angivet . Vi skriver filen ved at bruge skrivemetoden for filobjektet til den mappe, der er blevet nรฆvnt.

Kodelinje 34: Hvis der ikke er nogen undtagelse, indstiller vi attributten i anmodningen som gurumessage med vรฆrdien "Fil uploadet med succes".

Kodelinje 35-36: Hvis der opstรฅr en undtagelse, skal du indstille meddelelsen "File upload mislykkedes"

Kodelinje 40: Hvis filen ikke findes, skal du indstille beskeden som "Ingen fil fundet"

Kodelinje 42: Videresendelse af anmodning ved hjรฆlp af requestdispatcher-objekt til result.jsp med anmodnings- og svarobjekter.

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:

Kodelinje 10: Her fรฅr vi attributten fra anmodningsobjektet med vรฆrdi gurumessage til et strengobjekt.

Kodelinje 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, hvori 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 du klikker pรฅ upload-knappen, fรฅr vi beskeden om, at filen er uploadet.

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

I nedenstรฅende diagram kan vi se, at filen var blevet uploadet i 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:

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

Kodelinje 3-5: Her importerer vi FileInputStream , IO Exception og PrintWriter fra java.io-pakken.

Kodelinje 15: Vi definerer guru_download servlet som udvider HttpServlet.

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

Kodelinje 19-20: Vi sรฆtter indhold Indtast svarobjekt og fรฅ ogsรฅ skribentobjekt fra svar.

Kodelinje 21-22: Definition af en variabel som gurufil som vรฆrdi test.txt og gurupath som c:/guru/upload/

Kodelinje 23-25: Vi indstiller indholdstypen ved hjรฆlp af responsobjekt, og vi bruger setHeader-metoden, som sรฆtter header i svarobjektet som det filnavn, der er blevet uploadet.

Kodelinje 27-28: Vi opretter FileInputStream, hvor vi tilfรธjer gurupath+gurufile.

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

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

Output:

Downloader fil

Output:

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

Resumรฉ

  • Vi har lรฆrt om registreringsformularen til at registrere i enhver ansรธgning
  • Lรฆrte mere om, hvordan login- og logoutformularerne fungerer.
  • Lรฆrte ogsรฅ om upload og download af en fil gennem JSP.

Opsummer dette indlรฆg med: