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ı
Bu yazıda da bu kadar arkadaşlar. Başka bir yazıda görüşmek üzere sağlıcakla kalın.
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.