Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
dosyayı istemciye yollarkern http header 'ına
response.setHeader("content-disposition","attachment; filename=veriler.xls")
şeklinde header eklersen soun olmaz.
N/A
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
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 yapabilirim
The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com
|
|
Yazar |
|
blackout
Kayıt: 11.12.2008 |
|
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
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 okuyabilrim
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
Kayıt: 11.12.2008 |
|
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
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ım
The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com
|
|
Yazar |
|
extreme
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
Bu şekilde çalıştı ama karakterlerde sorun var o yüzden resim saçma görünüyo 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
Kayıt: 11.12.2008 |
|
extreme yazdi | her tür dosya tipini desteklemesi içn ne yapmalıyım |
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
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
Kayıt: 11.12.2008 |
|
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
Bu şekilde yaptık oldu. Çok teşekkür ederim
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
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
Son birşey daha sorucam. Şimdi ben sesiona gerekli verileri yazıp bu servlet sayfasını açmalıyım. Onu nasıl yapabilirm.
Ayrı bi sayfa açılmadan önce bi action çalıştırmam lazım.
JSF deki navigtionlar ile olmaz sanırım.
html bilmemekten hep
The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com
|
|
Yazar |
|
blackout
Kayıt: 11.12.2008 |
|
Son yazdığını biraz daha açar mısın?
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | | | | | |