JSF

JSF Dersleri-Dosya Yüklerken Uzantı ve Boyut Kısıtlama

Merhaba arkadaşlar. Dosya Yükleme yazımızda bir JSF projesine dışarıdan nasıl doya alınabildiğini öğrenmiştik. Bu yazıda ise dosya yüklenmesi sırasında uzantı ve boyut kısıtlaması işlemlerinin nasıl yapıldığını öğreneceğiz. Örnek uygulamamızda sadece doc/docx uzantısına sahip olan ve boyutu 100KB’den az olan dosyaların yüklenebildiği bir sistem yazılıdır. Örnek uygulamamızın kodları,kodların açıklaması ve ekran çıktıları şu şekilde:

index.xhtml Kodu

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="form" enctype="multipart/form-data">
  <h:inputFile id="file" value="#{bean.file}" validator="#{bean.validate}"/>
  <h:commandButton value="Upload" action="#{bean.upload}">
  </h:commandButton>
         </h:form>
    </h:body>
</html>

Xhtml kodumuz içinde h:inputFile etiketimizin validator bileşeni ile Java tarafında yazdığımız kısıtlama şartlarını bildiriyoruz. Butona basıp göndermek istediğimizde burada xhtml sayfasına verilen şartlar değerlendirilecek.

Bean.Java Kodu

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.servlet.Filter;
import javax.servlet.http.Part;
import javax.servlet.*;
import java.io.*;
@ManagedBean
@RequestScoped
@FacesValidator
public class Bean implements Filter,Validator{
    private Part file;

    @Override
    public void destroy() {

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest requset,
                         ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        requset.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(requset, response);
    }
    
    public Part getFile() {
        return file;
    }

    public void setFile(Part file) {
        this.file = file;
    }
    public String getFileName(Part part)
    {
        for(String cd:part.getHeader("content-disposition").split(";"))
            if(cd.trim().startsWith("filename")){
                String filename=cd.substring(cd.indexOf('=')+1).trim().replace(""", "");
                return filename.substring(filename.lastIndexOf('/')+1).substring(filename.lastIndexOf('\')+1);
            }
        return null;
                
    }
    public void upload()
    {
        try{
        file.write("C:\Users\ilkay\Documents\NetBeansProjects\WebApplication1\Dosyalar\"+getFileName(file));
        }
        catch(Exception ex)
        {
            System.err.print(ex);
        }
    }
    @Override
         public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Part part = (Part) value;
        if(part.getSize()>102400){
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Dosya boyutu sınırdan büyük.", "Dosya boyutu sınırdan büyük."));
        }
        if (!"application/vnd.openxmlformats-officedocument.wordprocessingml.document".equals(part.getContentType())) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Doc/Docx Dosyası Değil", "Doc/Docx Dosyası Değil"));
        }

    }   
}

Dosya yükleme yazımızda yazdığımız Java koduna ek olarak burada validate() metodunu ekledik. Gördüğünüz üzere bu metot bir Override metot. Bunu Validator arayüzünden alarak sağladık. Metot içinde 2 if komutu ile dosyanın hem boyutu ile hem de uzantısı denetleniyor. Eğer yazdığınız uygulama sadece doc/docx uzantısını alsın istiyorsanız application/vnd.openxmlformats officedocument.wordprocessingml.document ifadesini şart olarak vermelisiniz. Eğer resim yüklenmesini isterseniz image/jpeg ya da txt yüklenmesini istiyorsanız text/plain ifadesini kullanabilirsiniz.

Ekran Çıktıları

Bir txt dosyası seçtim. Şimdi Yükle butonuna tıklayacağım.

Bir txt dosyası seçtim. Şimdi Yükle butonuna tıklayacağım.

 

 

 

 

 

 

 

 

 

 

 

Yükle butonuna tıkladım ama doc/docx olmadığı için yüklemedi ve hata verdi.

Yükle butonuna tıkladım ama doc/docx olmadığı için yüklemedi ve hata verdi.

 

 

 

 

 

 

 

 

 

 

 

Şimdi boyutu 100KB üstü olan bir docx dosyası seçtim.

Şimdi boyutu 100KB üstü olan bir docx dosyası seçtim.

 

 

 

 

 

 

 

 

 

Dosyanın verdiğim 100KB sınırından büyük olduğuna dair hata mesajı verildi.

Dosyanın verdiğim 100KB sınırından büyük olduğuna dair hata mesajı verildi.

 

 

 

 

 

 

 

 

 

 

 

Bu yazıda da bu kadar arkadaşlar. Başka bir yazıda görüşmek üzere sağlıcakla kalın.

 

 

1 Yorum

  • Merhaba hocam;

    Validator dersinizde kullandığımız gibi h:message etiketini kullanmassak ben validator tarafından hata fırlatmasına rağmen uyarı alamadım. Ustteki kodda gözden kaçmış galiba. Bilginize sunar iyi çalışmalar dilerim.

bilalekrem için bir yanıt yazın X