JSP-tiedoston lataus ja lataus
Tรคssรค esimerkissรค opimme tiedoston lรคhettรคmisestรค ja lataamisesta JSP:n kautta.
Tiedoston syรถttรถ ovat erittรคin tรคrkeitรค toimintoja. Tรครคllรค aiomme lukea ja kirjoittaa tiedoston JSP:llรค.
JSP-tiedoston lataus
- Voimme ladata mitรค tahansa tiedostoja JSP:llรค.
- Se voi olla tekstitiedosto, binรครคritiedosto, kuvatiedosto tai mikรค tahansa muu asiakirja.
- Tรคssรค tiedoston lataamisen tapauksessa kรคytetรครคn vain POST-menetelmรครค, ei GET-menetelmรครค.
- Enctype-attribuutiksi tulee asettaa moniosainen/form-data.
Esimerkki: Toiminnon kรคyttรคminen
Tรคssรค esimerkissรค lataamme tiedoston IO-objektin avulla
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>
Koodin selitys:
Action_file.jsp
Code Rivi 12โ18: Tรครคllรค luomme tiedostokentรคllรค varustetun lomakkeen, joka lataa tiedoston palvelimelle ja toiminto vรคlitetรครคn osoitteeseen action_file_upload.jsp
Action_file_upload.jsp
Code Rivi 20: Tรคssรค annamme tiedostopolun tiettyyn polkuun
Code Rivi 23โ38: Tรครคllรค tarkistamme, onko sisรคltรถtyyppi moniosainen/form-data. Jos nรคin on, sisรคltรถ on tiedostotyyppiรค ja se luetaan. Kun tiedosto on luettu, se kirjoitetaan vรคliaikaiseen tiedostoon ja sitten vรคliaikainen tiedosto muunnetaan pรครคtiedostoksi.
Kun suoritat yllรค olevan koodin, saat seuraavan tulosteen
lรคhtรถ:
Lataamme tiedoston kรคyttรคmรคllรค Valitse tiedosto -painiketta ja Lataa tiedosto -painike lataa tiedoston palvelimelle annettuun polkuun.
Esimerkki: JSP-toimintojen kรคyttรคminen
Tรคssรค esimerkissรค aiomme ladata tiedoston kรคyttรคmรคllรค JSP-toimintoja. Otamme lomakkeen, jossa on "lataa"-painike, ja kun napsautat latauspainiketta, tiedosto ladataan.
Lรคhetetรครคn_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>
Koodin selitys:
Code Rivi 11โ12: Tรคssรค otamme lomakkeen, jossa on toiminto servletille guru_upload, joka kulkee POST-menetelmรคn lรคpi. Lisรคksi tรคssรค enctype eli attribuutti, joka mรครคrittรครค kuinka lomaketiedot tulee koodata ja lรคhettรครค palvelimelle ja sitรค kรคytetรครคn vain POST-menetelmรคllรค. Tรคssรค asetetaan moniosainen/form-data, joka on tiedostoa varten (koska data on suuri).
Code Rivi 13: Tรคssรค mรครคritรคmme guru_file-elementin tyypin tiedostolla ja annamme kooksi 50.
Code Rivi 15: Tรคmรค on lรคhetystyypin painike, jonka nimi on "Lataa", jonka kautta toimintoservletti kutsutaan ja pyyntรถ kรคsitellรครคn siihen ja tiedosto luetaan ja kirjoitetaan servletiin.
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);
}
}
Koodin selitys:
Code Rivi 12โ14: Tรครคllรค meidรคn on tuotava org.apache.commons-kirjasto koodin kokoonpanoon. Meidรคn on tuotava fileupload-luokka org.apache.commons-kirjastosta.
Code Rivi 23: Tรคssรค meillรค on doPost()-menetelmรค, jota kutsutaan, kun vรคlitรคmme POST-menetelmรคn JSP:ssรค ja se pyytรครค ja vastaa objekteja parametreinaan
Code Rivi 26: Tรคssรค luomme ServletFileUpload-luokan objektia fileUpload-paketista org.apache.commons-kirjastosta, joka tarkistaa, onko JSP:ssรค tiedostoobjekteja. Jos niitรค lรถytyy, ne tiedostoobjektit otetaan pyynnรถstรค.
Code Rivi 27โ32: Toistamme tiedostojen mรครคrรคn tarkistamalla kuinka monta tiedostokohdetta on moniosaisessa objektissa, joka on listaobjekti (jos lataamme useamman kuin yhden tiedoston) ja tallennamme sen c:/guru/upload-kansioon annetulla tiedostonimellรค . Kirjoitamme tiedostoa tiedostoobjektin kirjoitusmenetelmรคllรค mainittuun kansioon.
Code Rivi 34: Jos ei ole poikkeusta, asetamme pyynnรถstรค attribuutin gurumessage-arvolla "Tiedosto ladattu onnistuneesti".
Code Rivi 35โ36: Jos poikkeus tapahtuu, aseta viesti "Tiedoston lataus epรคonnistui"
Code Rivi 40: Jos tiedostoa ei lรถydy, aseta viestiksi "Tiedostoa ei lรถydy"
Code Rivi 42: Pyynnรถn edelleenlรคhetys requestdispatcher-objektilla tulos.jsp-tiedostoon pyyntรถ- ja vastausobjektien kanssa.
Tulos.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>
Koodin selitys:
Code Rivi 10: Tรคssรค saamme attribuutin pyyntรถobjektista, jossa on arvo gurumessage, merkkijonoobjektiksi.
Code Rivi11: Tรคssรค tulostamme tรคmรคn viestin.
Kun suoritamme yllรค olevan koodin, saamme seuraavan tulosteen
lรคhtรถ:
Saamme lomakkeen, jossa on kenttiรค tiedoston valitsemiseksi hakemistosta. Kun tiedosto on valittu, meidรคn on napsautettava latauspainiketta.
Kun latauspainiketta napsautetaan, saamme viestin, ettรค tiedosto on ladattu onnistuneesti.
Alla olevassa kaaviossa nรคemme, ettรค tiedosto oli ladattu c:/guru/upload-kansioon.
JSP-tiedoston lataus
Tรคssรค esimerkissรค aiomme ladata tiedoston hakemistosta napsauttamalla painiketta.
Ladataan_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>
Koodin selitys:
Code Rivi 10: Tรคssรค olemme antaneet linkin tiedoston lataamiseen kansiosta c:/guru/upload servletillรค guru_download.
Guru_lataus.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
}
}
Koodin selitys:
Code Rivi 3โ5: Tรคssรค tuomme FileInputStream-, IO Exception- ja Print-kรคskyjรค.Writer java.io-paketista.
Code Rivi 15: Mรครคrittelemme guru_downloada servetti joka laajentaa HttpServlet.
Code Rivi 18: Kuten olemme mรครคritelleet href-tunnisteen, joka suljetaan URL joten GET-metodi kรคsitellรครคn (doGet-metodia kutsutaan servletissรค), joka sisรคltรครค myรถs pyyntรถ- ja vastausobjektit.
Code Rivi 19โ20: Asetamme sisรคllรถn Kirjoita vastausobjektiin ja saamme myรถs kirjoittajaobjektin vastauksesta.
Code Rivi 21โ22: Muuttujan mรครคrittรคminen gurufile-tiedostoksi arvoksi test.txt ja gurupath muotoon c:/guru/upload/
Code Rivi 23โ25: Asetamme sisรคltรถtyyppiรค kรคyttรคmรคllรค vastausobjektia ja kรคytรคmme setHeader-metodia, joka asettaa otsikon vastausobjektiin ladatun tiedoston nimeksi.
Code Rivi 27โ28: Luomme FileInputStreamia, johon lisรครคmme gurupath+gurufile.
Code Rivi 31โ33: Tรคssรค olemme ottaneet a samalla silmukka joka toimii, kunnes tiedosto on luettu, joten olemme antaneet ehdon muodossa != -1. Tรคssรค tilassa kirjoitamme kรคyttรคmรคllรค printwriter-objektia.
Kun suoritat yllรค olevan koodin, saat seuraavan tulosteen
lรคhtรถ:
lรคhtรถ:
Meidรคn on napsautettava downloading_1.jsp, niin saamme hyperlinkin nimellรค "Lataa tรคstรค". Kun napsautat tรคtรค hyperlinkkitiedostoa, se ladataan jรคrjestelmรครคn.
Yhteenveto
- Olemme oppineet rekisterรถintilomakkeen, jolla voit rekisterรถityรค mihin tahansa hakemukseen
- Opi lisรครค sisรครคn- ja uloskirjautumislomakkeen toiminnasta.
- Opit myรถs tiedoston lataamisesta JSP:n kautta.





