Seam Veritabanına Dosya Yükleme

Seam ile veritabanına dosya yükleme yapmak istiyorsanız aşağıdaki örneği kullanabilirsiniz.

Öncelikle yüklemeyi yapacağımız entity yi hazırlıyoruz. Bu dosyayı saklayacağımız alan içerik alanıdır. Bunu @Lob olarak tanıtıyoruz bu sayede veritabanında istediğimiz tipte saklayacaktır. Bunun haricinde @Basic(fetch = FetchType.LAZY) dersek sadece talep anında bilgiye ulaşacak ve dosya listesini çekmek istediğimizde gereksiz yere içerikleri çekmeyecektir.

     
    import java.io.Serializable;
     
    import javax.persistence.Basic;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Lob;
     
    @Entity
    public class Dosya implements Serializable {
     
     @Id
     @GeneratedValue
     private Long id;
     private String adi;
     private String dosyaTipi;
     private long boyut;
     
     @Lob
     @Basic(fetch = FetchType.LAZY)
     private byte[] icerik;
     
     //get ve set metodlari
     
    }

Şimdi dosyaları yüklemeyi sağlayan seam componentini yazıyoruz.

    import java.util.List;
     
    import javax.faces.context.FacesContext;
    import javax.persistence.EntityManager;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
     
    import org.jboss.seam.annotations.In;
    import org.jboss.seam.annotations.Name;
     
    import com.mergecons.seamprojectyeni.entity.Dosya;
     
    @Name("dosyaYukleme")
    public class DosyaYukleme {
     
     @In
     EntityManager entityManager;
     
     private Dosya dosya = new Dosya();
     
     public List<Dosya> dosyaListesi(){
      return entityManager.createQuery("from Dosya").getResultList();
     }
     
     public void yukle(){
      entityManager.persist(getDosya());
     }
     
     public void indir(Long id){
      Dosya dosya = entityManager.find(Dosya.class, id);
     
      HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
      response.setContentType(dosya.getDosyaTipi());
                    response.addHeader("Content-disposition", "attachment; filename=\"" + dosya.getAdi() +"\"");
      try {
       ServletOutputStream os = response.getOutputStream();
       os.write(dosya.getIcerik());
       os.flush();
       os.close();
       FacesContext.getCurrentInstance().responseComplete();
      } catch(Exception e) {
       e.printStackTrace();
      }
     }
     
     public void setDosya(Dosya dosya) {
      this.dosya = dosya;
     }
     
     public Dosya getDosya() {
      return dosya;
     }
    }

Son olarak dosya yükleyen listeleyen ve download edilmesini sağlayan xhtml i hazırlıyoruz.

    <!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://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core"
     xmlns:ui="http://java.sun.com/jsf/facelets"
     xmlns:s="http://jboss.com/products/seam/taglib"
          xmlns:rich="http://richfaces.org/rich">
     
    <body>
    <h:form enctype="multipart/form-data">
     <s:fileUpload id="file" data="#{dosyaYukleme.dosya.icerik}"
      contentType="#{dosyaYukleme.dosya.dosyaTipi}"
      fileName="#{dosyaYukleme.dosya.adi}"
      fileSize="#{dosyaYukleme.dosya.boyut}" />
     
     <h:commandButton action="#{dosyaYukleme.yukle}" value="Yükle" />
     
     <br />
     <br />
     <br />
     <rich:dataTable var="dosya" value="#{dosyaYukleme.dosyaListesi()}" width="600px">
      <rich:column>
       <f:facet name="header">Dosya Adi</f:facet>
       <h:commandLink value="#{dosya.adi}" action="#{dosyaYukleme.indir(dosya.id)}" />
      </rich:column>
      <rich:column>
       <f:facet name="header">Dosya Tipi</f:facet>
                         #{dosya.dosyaTipi}
                     </rich:column>
      <rich:column>
       <f:facet name="header">Dosya Boyutu</f:facet>
                         #{dosya.boyut}
         </rich:column>
     </rich:dataTable>
    </h:form>
    </body>
     
    </html>
  1. volkan
    Jul 19th, 2011 at 08:08 | #1

    melih hocam bu şekilde veritabanında blob türünde saklıyor galiba
    peki biz bir upload klasörü oluşturup onun içine atsak veritabanında sadece dizin bilgisini tutsak bunu nasıl yaparız

  2. Jul 19th, 2011 at 18:01 | #2

    Byte array seklinde gelen nesneyi FileOutputStream ile diske yazabilirsin hocam.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>