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


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
26.06.2009-11:35 #61867
file serverda yada server'in herhangi bir klasöründe kayıtlı "1.dat" gibi bir dosyayı link olarak client'a vermek istiyorum. Ama dosyanın linkini göremesin ve "1.dat" isimli dosyayı "veriler.xls" olarak görsün keydetsin. "1.dat" dosya ismini hiç bir şekilde görmesin istiyorum. Bunu nasıl bir yapı ile yapabilirim?

Veritabanında dosyanın adını ("veriler.xls") ve gerçek dosya konumunu tutuyorum ("C:1.dat"). verileri o şekilde alacağım.





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





Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
26.06.2009-11:47 #61868
dosyayı istemciye yollarkern http header 'ına
response.setHeader("content-disposition","attachment; filename=veriler.xls")

şeklinde header eklersen soun olmaz.





N/A
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
26.06.2009-11:51 #61869
Sorunu yanlış anladım. Şöyle birşey deneyip sonra yukarıdaki soylediğimi yapman lazım.
Bir servlet yaz bu servlet şu şekilde parametre alsın
www.iucoders.com/app/downloadfile

Bu servlet datayı diskten okusun kullanıcıya yazsın. http header ına da yukarıdaki dediğim şeyi eklesin.






N/A
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
26.06.2009-11:58 #61871
orhan yazdi
 
dosyayı istemciye yollarkern http header 'ına
response.setHeader("content-disposition","attachment; filename=veriler.xls")

şeklinde header eklersen soun olmaz.


Dosya adını veritabanından alıcam. değişebilir olması lazım.

orhan yazdi
 
Sorunu yanlış anladım. Şöyle birşey deneyip sonra yukarıdaki soylediğimi yapman lazım.
Bir servlet yaz bu servlet şu şekilde parametre alsın
www.iucoders.com/app/downloadfile

Bu servlet datayı diskten okusun kullanıcıya yazsın. http header ına da yukarıdaki dediğim şeyi eklesin.


Bunu nasıl yapabilirimconfused





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





Yazar
blackout


avatar

Kayıt: 11.12.2008
26.06.2009-12:48 #61874
1. Dosyanın konumunu ve görünürdeki adını veritabanından çek (DOSYA_KONUMU, GORUNUR_ADI)
2. Dosyanın görünür adını http başlığına ekle: response.setHeader("content-disposition","attachment; filename=" + GORUNUR_ADI)
3. DOSYA_KONUMU konumundaki dosyayı oku ve okuduğun datayı olduğu gibi kullanıcıya gönder (yani ekrana yazdır)

Mantık bu kadar... Bu işlem sırasında 1 karakter bile fazladan output olmamasına dikkat et; çünkü dosyadaki veri binary hassas ise dosya bozuk inebilir.


Burada ek olarak (her ihtimale karşı) dosya içeriğini yazdırmadan önce bazı http header verileri de göndermen gerekebilir:

response.setHeader("Pragma", "Public");
response.setHeader("Content-Transfer-Encoding", "binary"); // binary dosyalar için
response.setHeader("Content-Length", DOSYA_BOYUTU); // dosyanın byte cinsinden boyutu
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setContentType("application/vnd.ms-excel"); // dosyanın MIME tipine göre değişir.







Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-13:23 #61906
PDF, resim , word .... hertürlü dosya kaydedebilmem lazım.
Şöyle birşeyler denedim, farklı kütüphanelerle ama resim okumayadım. text dosyalarında sorun olmadı. Verileri binary olarak nasıl okuyabilrimconfused

 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Content-Transfer-Encoding", "binary");
        PrintWriter out = response.getWriter();
        int tempChar;
        try {
            response.setHeader("content-disposition","attachment; filename=x.jpg");
            FileInputStream in = new FileInputStream(new File("c:\burak.jpg"));
            DataInputStream dis = new DataInputStream(in);

            while(true){
                out.print( dis.readByte() );
            }
        } finally { 
            out.close();
        }
    } 






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





Yazar
blackout


avatar

Kayıt: 11.12.2008
27.06.2009-13:27 #61907
JPEG kaydetmen için

response.setContentType("image/jpeg");

yapman lazım.


İlk mesajımda da belirttiğim gibi dosya türüne göre MIME tipini belirtmen gerekebiliyor. Zaten oraya "text/html" gibi bir şey yaptığında beklediğin gibi çalışması imkansız. Sadece html sayfalrı için "text/html" kullanmalısın.





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-13:37 #61908
blackout yazdi
 
JPEG kaydetmen için

response.setContentType("image/jpeg");

yapman lazım.


İlk mesajımda da belirttiğim gibi dosya türüne göre MIME tipini belirtmen gerekebiliyor. Zaten oraya "text/html" gibi bir şey yaptığında beklediğin gibi çalışması imkansız. Sadece html sayfalrı için "text/html" kullanmalısın.


her tür dosya tipini desteklemesi içn ne yapmalıyımconfused





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





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-14:06 #61909
Bu şekilde çalıştı ama karakterlerde sorun var o yüzden resim saçma görünüyod oh karakter setini nasıl ayarlayabilirim?

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       
       
        PrintWriter out = response.getWriter();
        int tempChar;
        String tempLine;
        try {
            response.setHeader("Content-Transfer-Encoding", "binary");
            response.setHeader("content-disposition","attachment; filename=x.jpg");
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setContentType("image/jpeg");
            BufferedReader  myFile= new BufferedReader(new FileReader(new File("c:\burak.jpg")));
            while (myFile.ready()) {
                out.print((char)myFile.read());
            }
        } finally { 
            out.close();
        }
    } 







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





Yazar
blackout


avatar

Kayıt: 11.12.2008
27.06.2009-14:39 #61911
extreme yazdi
 
her tür dosya tipini desteklemesi içn ne yapmalıyımconfused

Bunun için bir kontrol yapısı kullanman lazım. Dosyanın MIME tipini öğrenebiliyorsan MIME tipine göre, ya da daha az güvenli bir yol olarak uzantısına göre Content-Type verisini değiştirmen gerekiyor.
Örneğin:

if (UZANTI == "doc") cType = "application/msword";
else if (UZANTI == "xls") cType = "application/vnd.ms-excel";
else if (UZANTI == "pdf") cType = "application/pdf";
else if (UZANTI == "jpg") cType = "image/jpeg";
else if (UZANTI == "png") cType = "image/png";
.....
response.setContentType(cType);

Dosya bozuk iniyorsa muhtemelen o script içinde fazladan outputa gönderilen karakterler söz konusudur. İnen dosyanın byte cinsinden boyutu ile gerçek dosyanın byte cinsinden boyutunun eşit olup olmadığını kontrol ederek bunu gözlemleyebilirsin. Dosyaları bir binary editor ile açarak aralarındaki farkı görebilme şansın var. Fazlalık karakterler dosyanın ya başına ya da sonuna eklenebilir zaten.

Bu arada olayın karakter seti ile ilgisi yok çünkü binary veriden bahsediyoruz.





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-14:54 #61912
blackout yazdi
 
.


Gerçek resimde Ğ olarak görünen bir karakter indirdiğimde ? olarak görünüyo. Boyut aynı.





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





Yazar
blackout


avatar

Kayıt: 11.12.2008
27.06.2009-16:32 #61915
O zaman dosyayı binary okuma ya da binary yazdırma konusunda problem yaşıyor olabilirsin.

Şu örnekleri incele istersen:

http://www.java2s.com/Code/Java/JSP/ReadingBinaryData.htm
http://www.java-examples.com/read-file-using-fileinputstream





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-17:41 #61920
Bu şekilde yaptık oldu. Çok teşekkür ederimapplause

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        String realFileName = readFromSession("REALFILENAME").toString();
        String FileName = readFromSession("FILENAME").toString();
       
        PrintWriter out = response.getWriter();
        int tempChar;
        String tempLine;
        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("c:\"+realFileName);
            int numberBytes = fileinputstream.available(); 
            for(int i = 0; i < numberBytes; i++){
                out.print((char)fileinputstream.read());
            }
            fileinputstream.close();
        } finally { 
            out.close();
            deleteFromSession("REALFILENAME");
            deleteFromSession("FILENAME");
        }
    }






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





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
27.06.2009-23:55 #61935
Son birşey daha sorucambiggrin. Şimdi ben sesiona gerekli verileri yazıp bu servlet sayfasını açmalıyım. Onu nasıl yapabilirmconfused.
Ayrı bi sayfa açılmadan önce bi action çalıştırmam lazım.

JSF deki navigtionlar ile olmaz sanırım.d oh

html bilmemekten hepsillyskull





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





Yazar
blackout


avatar

Kayıt: 11.12.2008
29.06.2009-15:42 #61978
Son yazdığını biraz daha açar mısın?





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