JSP Dosya Yükleme ve İndirme
⚡ Akıllı Özet
JSP dosya yükleme ve indirme, bir web uygulamasının kullanıcılardan dosya almasını ve onlara dosya sunmasını sağlayan temel giriş ve çıkış işlemleridir. Bu kaynak, JSP eylem formları, Apache Commons FileUpload ve servlet sınıflarını kullanarak her iki akışı da eksiksiz çalışan kod örnekleriyle açıklamaktadır.

JSP Dosya Yükleme
- JSP kullanarak herhangi bir dosyayı yükleyebiliriz.
- Bir metin dosyası, ikili dosya, görüntü dosyası veya başka herhangi bir belge olabilir.
- Burada dosya yükleme durumunda GET yöntemi değil, yalnızca POST yöntemi kullanılacaktır.
- Enctype özelliği multipart/form-data olarak ayarlanmalıdır.
Örnek: Eylemi Kullanma
Bu örnekte, IO nesnesini kullanarak bir dosya yüklüyoruz.
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>
Kodun açıklaması:
Action_file.jsp
Code 12-18 satır: Burada, sunucuya dosya yükleyecek bir dosya alanı içeren bir form oluşturuyoruz ve işlem action_file_upload.jsp'ye iletilecek.
Action_file_upload.jsp
Code Çizgi 20: Burada dosya yolunu belirli bir yola yönlendiriyoruz.
Code 23-38 satır: Burada içerik türünün multipart/form-data olup olmadığını kontrol ediyoruz. Eğer öyleyse, içerik dosya türündedir ve okunur. Dosya okunduktan sonra geçici bir dosyaya yazılır ve ardından geçici dosya ana dosyaya dönüştürülür.
Yukarıdaki kodu çalıştırdığınızda aşağıdaki çıktıyı alırsınız:
Çıktı:
Dosya seçme butonunu kullanarak bir dosya yüklüyoruz ve dosya yükleme butonu, dosyayı belirtilen yola sunucuya yükleyecektir.
Örnek: JSP işlemlerini kullanma
Bu örnekte, JSP işlemleri kullanarak bir dosya yükleyeceğiz. "Yükle" düğmesi bulunan bir formumuz olacak ve yükleme düğmesine tıkladığınızda dosya yüklenecektir.
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>
Kodun açıklaması:
Code 11-12 satır: Burada, guru_upload servlet'inde bir işlem gerçekleştiren ve POST yöntemiyle veri gönderecek bir form alıyoruz. Ayrıca, burada enctype özniteliği, form verilerinin nasıl kodlanıp sunucuya gönderileceğini belirtir ve yalnızca POST yöntemiyle kullanılır. Burada bunu multipart/form-data olarak ayarlıyoruz, bu da dosya için (veriler büyük olacağı için) uygundur.
Code Çizgi 13: Burada guru_file öğesini dosya türüyle tanımlıyor ve boyutunu 50 olarak veriyoruz.
Code Çizgi 15: Bu, üzerinde "Yükle" yazan bir gönder düğmesidir; bu düğme aracılığıyla işlem servlet'i çağrılacak, istek orada işlenecek ve dosya okunup servlet'e yazılacaktır.
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); } }
Kodun açıklaması:
Code 12-14 satır: Burada, org.apache.commons kütüphanesini kodun yapılandırmasına dahil etmemiz gerekecek. org.apache.commons kütüphanesinden fileupload sınıfını içe aktarmamız gerekecek.
Code Çizgi 23: Burada, JSP'de POST yöntemini geçirdiğimiz için çağrılacak olan doPost() yöntemimiz var ve bu yöntem parametre olarak istek ve yanıt nesnelerini alacak.
Code Çizgi 26: Burada, org.apache.commons kütüphanesinin fileUpload paketinden ServletFileUpload sınıfından bir nesne oluşturuyoruz. Bu nesne, JSP'de herhangi bir dosya nesnesi olup olmadığını kontrol edecek. Eğer dosya nesnesi bulunursa, bu dosya nesneleri istekten alınacaktır.
Code 27-32 satır: Birden fazla dosya yüklersek, liste nesnesi olan multiparts nesnesinde kaç dosya öğesi bulunduğunu kontrol ederek dosya sayısı üzerinde yineleme yapacağız ve sağlanan dosya adıyla c:/guru/upload klasörüne kaydedeceğiz. Dosyayı, dosya nesnesinin write yöntemini kullanarak belirtilen klasöre yazıyoruz.
Code Çizgi 34: Herhangi bir istisna yoksa, istekte "Dosya başarıyla yüklendi" değeriyle gurumessage adında bir öznitelik tanımlıyoruz.
Code 35-36 satır: Bir hata oluşursa, "Dosya yükleme başarısız oldu" şeklinde bir mesaj görüntüleriz.
Code Çizgi 40: Dosya bulunamazsa, mesaj olarak "Dosya bulunamadı" ifadesini gösteririz.
Code Çizgi 42: İstek, requestdispatcher nesnesi kullanılarak request ve response nesneleriyle birlikte result.jsp sayfasına iletilir.
Sonuç.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>
Kodun açıklaması:
Code Çizgi 10: Burada, istek nesnesinden "gurumessage" değerine sahip özniteliği bir dize nesnesine alıyoruz.
Code Çizgi 11: İşte o mesajı basıyoruz.
Yukarıdaki kodu çalıştırdığımızda aşağıdaki çıktıyı alırız:
Çıktı:
Karşımıza, dizinden dosya seçebileceğimiz alanların bulunduğu bir form çıkıyor. Dosya seçildikten sonra, yükleme düğmesine tıklamamız gerekiyor.
Yükleme düğmesine tıklandığında, dosyanın başarıyla yüklendiğine dair bir mesaj alıyoruz.
Aşağıdaki şemada, dosyanın c:/guru/upload klasörüne yüklendiğini görebiliriz.
JSP Dosyası İndir
Bu örnekte butona tıklayarak bir dizinden dosya indireceğiz.
İndiriliyor_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>
Kodun açıklaması:
Code Çizgi 10: Burada, guru_download servlet'ini kullanarak c:/guru/upload klasöründen bir dosyayı indirmek için bir bağlantı verdik.
Guru_indir.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 } }
Kodun açıklaması:
Code 3-5 satır: Burada FileInputStream, IOException ve Print'i içe aktarıyoruz.Writer java.io paketinden.
Code Çizgi 15: Guru_download'ı tanımlıyoruz. sunucu uygulaması bu HttpServlet'i genişletir.
Code Çizgi 18: Daha önce tanımladığımız gibi, bir href etiketi bir ... içine alınacaktır. URLBu sayede GET metodu işlenecek (servlet içinde doGet çağrılacak), bu da istek ve yanıt nesnelerini içerecektir.
Code 19-20 satır: Yanıt nesnesinde içerik türünü belirliyoruz ve ayrıca yanıttan yazıcı nesnesini de alıyoruz.
Code 21-22 satır: gurufile adında bir değişken tanımlanıyor ve değeri test.txt, gurupath ise c:/guru/upload/ olarak belirleniyor.
Code 23-25 satır: Yanıt nesnesini kullanarak içerik türünü belirliyoruz ve yüklenen dosya adını yanıt nesnesine başlık olarak ekleyen setHeader yöntemini kullanıyoruz.
Code 27-28 satır: Gurupath+gurufile'ı ekleyeceğimiz bir FileInputStream oluşturuyoruz.
Code 31-33 satır: Burada bir tane aldık döngü sırasında Bu işlem dosya okunana kadar devam edecektir, bu nedenle koşulu != -1 olarak belirledik. Bu koşulda, printwriter nesnesini kullanarak çıktı yazıyoruz.
Yukarıdaki kodu çalıştırdığınızda aşağıdaki çıktıyı alacaksınız:
Çıktı:
downloading_1.jsp dosyasına tıklamamız gerekiyor ve "Buradan İndir" şeklinde bir bağlantı göreceğiz. Bu bağlantıya tıkladığınızda dosya sisteme indirilecektir.





