JSP Dosya Yükleme ve İndirme

Bu örnekte, JSP aracılığıyla bir dosyanın yüklenmesini ve indirilmesini öğreneceğiz.

Dosya Giriş çıkış işlemleri çok önemli işlemlerdir. Burada JSP kullanarak bir dosya okuyup yazacağız.

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

Kod Satırı 12-18: Burada dosya alanını sunucuya yükleyecek ve eylemi action_file_upload.jsp'ye iletecek olan form oluşturuyoruz.

Action_file_upload.jsp

Kod Satırı 20: Burada dosya yolunu belirli bir yola veriyoruz

Kod Satırı 23-38: Burada içerik türünün multipart/form-data olup olmadığını kontrol ediyoruz. Durum böyleyse içerik dosya türündedir ve okunur. Dosya okunduktan sonra geçici 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

JSP Dosya Yükleme

Çıktı:

Dosya seç butonu seçeneğini kullanarak dosya yüklüyoruz ve dosya yükle butonu dosyayı belirtilen yola sunucuya yükleyecektir.

Örnek: JSP işlemlerini kullanma

Bu örnekte, JSP işlemlerini kullanarak bir dosya yükleyeceğiz. "Yükle" düğmesi olan bir form alacağız ve yükle düğmesine tıkladığınızda dosya yüklenecek.

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

Kod Satırı 11-12: Burada servlet guru_upload üzerinde eylemi olan ve POST metodundan geçecek bir form alıyoruz. Ayrıca burada form verilerinin nasıl kodlanacağını ve sunucuya nasıl gönderileceğini belirten enctype yani öznitelik kullanıyoruz ve bu yalnızca POST metoduyla kullanılıyor. Burada dosya için olan multipart/form-data olarak ayarlıyoruz (çünkü veriler büyük olacak).

Kod Satırı 13: Burada guru_file elemanını file tipi ile belirleyip boyutunu 50 olarak veriyoruz.

Kod Satırı 15: Bu, üzerinde eylem sunucu uygulamasının çağrılacağı ve isteğin buna işleneceği ve dosyanın sunucu uygulamasına okunup yazılacağı, üzerinde "Yükleme" adı bulunan bir gönderme türü düğmesidir.

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

Kod Satırı 12-14: Burada org.Apache.commons kütüphanesini kodun konfigürasyonuna aktarmamız gerekecek. Org.Apache.commons kütüphanesinden fileupload sınıfını içe aktarmamız gerekecek.

Kod Satırı 23: Burada, JSP'de POST yöntemini geçerken çağrılacak doPost() yöntemimiz var ve parametreleri olarak nesneleri talep edecek ve yanıtlayacak.

Kod Satırı 26: Burada JSP'de herhangi bir dosya nesnesi olup olmadığını kontrol edecek org.Apache.commons kütüphanesindeki fileUpload paketinden ServletFileUpload sınıfının bir nesnesini oluşturuyoruz. Herhangi biri bulunursa bu dosya nesnesi istekten alınacaktır.

Kod Satırı 27-32: Bir liste nesnesi olan multiparts nesnesinde (birden fazla dosya yüklersek) kaç dosya öğesinin bulunduğunu kontrol ederek dosya sayısını yineleyeceğiz ve verilen dosya adıyla c:/guru/upload klasörüne kaydedeceğiz. . Dosyayı bahsettiğimiz klasöre dosya nesnesinin write metodunu kullanarak yazıyoruz.

Kod Satırı 34: Eğer bir istisna yoksa, istekte niteliği "Dosya başarıyla yüklendi" değerine sahip gurumessage olarak ayarlıyoruz.

Kod Satırı 35-36: İstisna oluşursa "Dosya yükleme başarısız oldu" mesajını ayarlama

Kod Satırı 40: Dosya bulunamazsa mesaj “Dosya bulunamadı” olarak ayarlanıyor

Kod Satırı 42: İstek, istek ve yanıt nesneleriyle requestdispatcher nesnesini kullanarak result.jsp'ye iletiliyor.

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

Kod Satırı 10: Burada istek nesnesinden gurumessage değerine sahip özelliği bir dize nesnesine alıyoruz.

Kod Satırı11: İşte o mesajı basıyoruz.

Yukarıdaki kodu çalıştırdığımızda aşağıdaki çıktıyı alırız

Çıktı:

Dizinden bir dosya seçmek için alanların bulunduğu bir form alıyoruz. Dosyayı seçtikten sonra yükle butonuna tıklamamız gerekiyor.

JSP işlemlerini Kullanarak Dosya Yükleme

Yükle butonuna tıkladığımızda dosyanın başarıyla yüklendiği mesajını alıyoruz.

JSP işlemlerini Kullanarak Dosya Yükleme

Aşağıdaki şemada dosyanın c:/guru/upload klasörüne yüklendiğini görebiliriz.

JSP işlemlerini Kullanarak Dosya Yükleme

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

Kod Satırı 10: Burada servlet guru_download kullanarak c:/guru/upload klasöründen bir dosya indirmek için bağlantı verdik.

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
	}

}

Kodun açıklaması:

Kod Satırı 3-5: Burada Java.io paketinden FileInputStream, IO Exception ve PrintWriter'ı içe aktarıyoruz.

Kod Satırı 15: guru_download'ı tanımlıyoruz sunucu uygulaması bu HttpServlet'i genişletir.

Kod Satırı 18: URL'nin içerisine eklenecek bir href tanımladığımız gibi, istek ve yanıt nesnelerini de kapsayan GET yöntemi işlenecek (servlet'te doGet çağrılacak).

Kod Satırı 19-20: İçerik Türünü yanıt nesnesine ayarlıyoruz ve ayrıca yanıttan yazar nesnesini alıyoruz.

Kod Satırı 21-22: Bir değişkeni gurufile olarak değer test.txt olarak ve gurupath'ı c:/guru/upload/ olarak tanımlama

Kod Satırı 23-25: İçerik türünü yanıt nesnesini kullanarak ayarlıyoruz ve yüklenen dosya adı olarak yanıt nesnesine başlığı ayarlayan setHeader yöntemini kullanıyoruz.

Kod Satırı 27-28: Gurupath+gurufile ekleyeceğimiz FileInputStream'i oluşturuyoruz.

Kod Satırı 31-33: Burada bir tane aldık döngü sırasında dosya okununcaya kadar çalışacak, dolayısıyla koşulu != -1 olarak verdik. Bu durumda printwriter nesnesini kullanarak yazıyoruz.

Yukarıdaki kodu çalıştırdığınızda aşağıdaki çıktıyı alacaksınız

Çıktı:

Dosya indiriliyor

Çıktı:

Downloading_1.jsp'ye tıklamamız gerekiyor, “Buradan İndirin” şeklinde bir köprü alacağız. Bu köprü dosyasına tıkladığınızda sisteme indirilecektir.

ÖZET

  • Herhangi bir uygulamaya kaydolmak için kayıt formunu öğrendik
  • Oturum açma ve oturum kapatma formlarının nasıl çalıştığı hakkında daha fazla bilgi edinin.
  • Ayrıca JSP aracılığıyla dosya yükleme ve indirme hakkında da bilgi edindim.

Bu yazıyı şu şekilde özetleyin: