Servletler - Dosya Yükleme

Bir Servlet, kullanıcıların sunucuya dosya yüklemesine izin vermek için bir HTML form etiketiyle birlikte kullanılabilir. Yüklenen bir dosya bir metin dosyası veya görüntü dosyası veya herhangi bir belge olabilir.

Dosya Yükleme Formu Oluşturma

Aşağıdaki HTM kodu bir yükleyici formu oluşturur. Dikkat edilmesi gereken önemli noktalar aşağıdadır:

  • Form method özellik şu şekilde ayarlanmalıdır: POST yöntem ve GET yöntemi kullanılamaz

  • Form enctype özellik şu şekilde ayarlanmalıdır: multipart/form-data.

  • Form actionözniteliği, arka uç sunucusunda dosya yüklemeyi işleyecek bir sunucu uygulaması dosyasına ayarlanmalıdır. Aşağıdaki örnek kullanıyorUploadServlet dosya yüklemek için servlet.

  • Tek bir dosya yüklemek için, type = "file" niteliğine sahip tek bir <input ... /> etiketi kullanmalısınız. Birden çok dosyanın yüklenmesine izin vermek için, ad özelliği için farklı değerlere sahip birden fazla giriş etiketi ekleyin. Tarayıcı, her biriyle bir Göz At düğmesini ilişkilendirir.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
</html>

Bu, yerel bilgisayardan bir dosya seçmeye izin veren aşağıdaki sonucu gösterecektir ve kullanıcı "Dosya Yükle" ye tıkladığında, form seçilen dosyayla birlikte gönderilecektir -

File Upload: 
Select a file to upload: 


NOTE: This is just dummy form and would not work.

Arka Uç Sunucusu Yazma

Servlet aşağıdadır UploadServletyüklenen dosyanın kabul edilmesine ve <Tomcat-installation-directory> / webapps / data dizininde saklanmasına dikkat eder. Bu dizin adı ayrıca bir harici yapılandırma kullanılarak da eklenebilir.context-param web.xml'deki öğe aşağıdaki gibidir -

<web-app>
   ....
   <context-param> 
      <description>Location to store uploaded file</description> 
      <param-name>file-upload</param-name> 
      <param-value>
         c:\apache-tomcat-5.5.29\webapps\data\
      </param-value> 
   </context-param>
   ....
</web-app>

Aşağıda, aynı anda birden fazla dosya yüklemesini gerçekleştirebilen UploadServlet'in kaynak kodu verilmiştir. Devam etmeden önce aşağıdakilerden emin olmalısınız -

  • Aşağıdaki örnek, FileUpload'a bağlıdır, bu nedenle uygulamasının en son sürümüne sahip olduğunuzdan emin olun. commons-fileupload.x.x.jarsınıf yolunuzdaki dosya. Buradan indirebilirsinizhttps://commons.apache.org/fileupload/.

  • FileUpload, Commons IO'ya bağlıdır, bu yüzden en son sürümüne sahip olduğunuzdan emin olun. commons-io-x.x.jarsınıf yolunuzdaki dosya. Buradan indirebilirsinizhttps://commons.apache.org/io/.

  • Aşağıdaki örneği test ederken, maxFileSize boyutundan daha küçük bir dosya yüklemelisiniz, aksi takdirde dosya yüklenmez.

  • Önceden c: \ temp ve c: \ apache-tomcat8.0.28 \ webapps \ data dizinlerini oluşturduğunuzdan emin olun.

// Import required java libraries
import java.io.*;
import java.util.*;
 
import javax.servlet.ServletConfig;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {
   
   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = getServletContext().getInitParameter("file-upload"); 
   }
   
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, java.io.IOException {
   
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
   
      if( !isMultipart ) {
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
  
      DiskFileItemFactory factory = new DiskFileItemFactory();
   
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
   
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
   
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);
	
         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
   
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               String contentType = fi.getContentType();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               fi.write( file ) ;
               out.println("Uploaded Filename: " + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
         } catch(Exception ex) {
            System.out.println(ex);
         }
      }
      
      public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, java.io.IOException {

         throw new ServletException("GET method used with " +
            getClass( ).getName( )+": POST method required.");
      }
   }
}

Derleme ve Çalıştırma Sunucusu

Yukarıdaki sunucu uygulaması UploadServlet'i derleyin ve aşağıdaki gibi web.xml dosyasında gerekli girişi oluşturun.

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

Şimdi, yukarıda oluşturduğunuz HTML formunu kullanarak dosyaları yüklemeyi deneyin. Http: // localhost: 8080 / UploadFile.htm'yi denediğinizde, yerel makinenizden herhangi bir dosya yüklemenize yardımcı olacak aşağıdaki sonucu görüntüleyecektir.

File Upload: 

Select a file to upload:


Servlet komut dosyanız düzgün çalışıyorsa, dosyanız c: \ apache-tomcat8.0.28 \ webapps \ data \ dizinine yüklenmelidir.