Konuyu görüntüle
IUCODERS FORUM > Programlama > JAVA > JSF - Dosya Kaydetme
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
29.06.2009-15:46 #61979
blackout yazdi
 
Son yazdığını biraz daha açar mısın?


jsf sayfasından servkete link vermeliyim sanırım çalışması için. Dosyaları bir datalistte göstereceğim ve bulardan birisine tıklandığı zaman sessiona onun id si yazılmalı. java kodları içerisinden bi servlet sayfasınamı yönlendirme yapmalıyım yoksa jsf kodları içinde commanlik tarzı bir yapı ile link verebilirmiyim? Tabi link açılmadan önce sessiona yine veri yazılmalı.





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
blackout


avatar

Kayıt: 11.12.2008
29.06.2009-15:53 #61981
Bir linke tıklandığında sayfa açılmadan önce session'a veri yazdıramazsın. Ajax ile mümkün fakat böyle bir şeyi neden yapmak istediğini merak ettim doğrusu. Neden bir linke tıklandığı anda session'a veri yazmak istiyorsun?





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
29.06.2009-16:01 #61982
blackout yazdi
 
Bir linke tıklandığında sayfa açılmadan önce session'a veri yazdıramazsın. Ajax ile mümkün fakat böyle bir şeyi neden yapmak istediğini merak ettim doğrusu. Neden bir linke tıklandığı anda session'a veri yazmak istiyorsun?


Dosyaları güvenli bir şekilde almak için gerçek dosya adını ve kullanıcının alacağı dosya adını sessiona yazmayı düşündüm. Veritabanındaki id yide yazıp servketten okuyabilirim dosya isimlerini farketmez aslında.

Sayfaya parametre olarak göndersem dışardan okunabilir dosyalar. Başka kullanıcıların dosyalarınada erişilebilir.

Sonuç olarak yapmak istediğim jsf de dosyayı seçinçe ona ait verileri sessiona yazıp servlette okuyup dosyayı ekrana verdikten sonra sessiondan silmek.





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
blackout


avatar

Kayıt: 11.12.2008
29.06.2009-16:11 #61983
Bence o kadar kasmana gerek yok. GET ile dosyanın id'sini göndermen yeterli. Kullanıcının bu id'yi bilmesinin bir zararı yok. Eğer dosyalar kullanıcıya özel ise zaten ilgili tabloda hangi kullanıcıya ait olduğu bilgisini tutuyorsundur. İzin kontrolünü dosya adını çektiğin sırada yapabilirsin. Eğer adam elle id giriyorsa ve ilgili dosya kendine ait değilse "dosya bulunumadı" gibi bir mesaj gösterirsin mesela.





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
29.06.2009-17:10 #61986
blackout yazdi
 
Bence o kadar kasmana gerek yok. GET ile dosyanın id'sini göndermen yeterli. Kullanıcının bu id'yi bilmesinin bir zararı yok. Eğer dosyalar kullanıcıya özel ise zaten ilgili tabloda hangi kullanıcıya ait olduğu bilgisini tutuyorsundur. İzin kontrolünü dosya adını çektiğin sırada yapabilirsin. Eğer adam elle id giriyorsa ve ilgili dosya kendine ait değilse "dosya bulunumadı" gibi bir mesaj gösterirsin mesela.


Dosyaları o kullanıcının yöneticileri vs. de görebilmeli rol hiyerarşisi henüz tam oluşmadı, başımı biraz ağrıtabilir o yöntemd oh





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
30.06.2009-18:08 #62036
Aşağıdaki şekilde çalıştırıyorum şu an. Ama şöyle bir problem var. Dosya ismindeboşluk olursa ekrana o dosyanın ismini sadece boşuluğa kadarki kısmı ile veriyor. Örnek olarak "asd ds.jpg" ise "asd" diye uzantısız bir dosya olarak alıyorum. Boşlukları _ ile değiştireceğim ama başka yol varmı?

 protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();


        if (request.getParameter("id") == null) {
            out.println("Dosya Bulunamadı.");
            out.close();
        }
        String DOC_Id = request.getParameter("id");

        try {
            Integer.parseInt(DOC_Id);
        } catch (Exception a) {
            out.println("Dosya Bulunamadı.");
            out.close();
        }

        String realFileName = null;
        String FileName = null;
        ResultSet rs;
        try {
            rs = dbConnection.returnResult("select * from HR_Document where DOC_Id = " + DOC_Id);
            realFileName = "c:\docs\" + DOC_Id + ".dat";
            if (rs.next()) {
                FileName = rs.getString("DOC_Name");
            } else {
                out.print("DOSYA BULUNAMADI : DB");
                out.close();
            }
        } catch (Exception ex) {
            out.print("DOSYA BULUNAMADI :" + ex.getMessage());
            out.close();
            return;
        }



        try {
            response.setHeader("Content-Transfer-Encoding", "binary");
            response.setHeader("content-disposition", "attachment; filename=" + FileName);
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            FileInputStream fileinputstream = new FileInputStream(realFileName);
            int numberBytes = fileinputstream.available();
            for (int i = 0; i < numberBytes; i++) {
                out.print((char) fileinputstream.read());
            }
            fileinputstream.close();
        } finally {
            out.close();
        }
    }






The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
blackout


avatar

Kayıt: 11.12.2008
30.06.2009-18:14 #62037
extreme yazdi
 
Aşağıdaki şekilde çalıştırıyorum şu an. Ama şöyle bir problem var. Dosya ismindeboşluk olursa ekrana o dosyanın ismini sadece boşuluğa kadarki kısmı ile veriyor. Örnek olarak "asd ds.jpg" ise "asd" diye uzantısız bir dosya olarak alıyorum. Boşlukları _ ile değiştireceğim ama başka yol varmı?


Dosya adını tırnak içine al

response.setHeader("content-disposition", "attachment; filename=\"" + FileName + "\"");





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
30.06.2009-19:35 #62040
firefox yazdi
 
C:DOCUME~1BURAKA~1LOCALS~1Temp kaydedilemedi, çünkü bilinmeyen bir hata meydana geldi.

Başka bir yere kaydetmeyi deneyin.


Saçma bi hata verdid oh





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
blackout


avatar

Kayıt: 11.12.2008
30.06.2009-21:15 #62051
extreme yazdi
 
firefox yazdi
 
C:DOCUME~1BURAKA~1LOCALS~1Temp kaydedilemedi, çünkü bilinmeyen bir hata meydana geldi.

Başka bir yere kaydetmeyi deneyin.


Saçma bi hata verdid oh

İlginç...thinking Elinde http response başlıklarını görebileceğin bir program veya firefox eklentisi varsa scripti onunla test edebilir misin? Ya da elinde domain varsa http://webtools.mozilla.org/web-sniffer/ aracını kullanarak da test edebilirsin.





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
30.06.2009-21:47 #62055
blackout yazdi
 
extreme yazdi
 
firefox yazdi
 
C:DOCUME~1BURAKA~1LOCALS~1Temp kaydedilemedi, çünkü bilinmeyen bir hata meydana geldi.

Başka bir yere kaydetmeyi deneyin.


Saçma bi hata verdid oh

İlginç...thinking Elinde http response başlıklarını görebileceğin bir program veya firefox eklentisi varsa scripti onunla test edebilir misin? Ya da elinde domain varsa http://webtools.mozilla.org/web-sniffer/ aracını kullanarak da test edebilirsin.


sorunu buldum. Veritabanında (ms sql server) dosya adı uzunluğunu 256 karakter olarak belirlemiştim. Sorguda sonucu Stringi "resim.jpg" + 247 tane boşluk olarak olıyordrooling.
Bu uzun boşluk saçmalığı yüzünden hata vermiş.

FileName = FileName.substring(0,FileName.substring(FileName.lastIndexOf('.')).indexOf(' ')+FileName.lastIndexOf('.'));

Dosya adını şöyle yapıp "" arasına alınca düzeldi. Teşekkürlerapplause





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





1 2
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb