Arama butonu
Bu konudaki kullanıcılar: 1 misafir
36
Cevap
3408
Tıklama
0
Öne Çıkarma
VERİTABANINA DOSYA EKLEMEK VE ONU İSTENİLDİĞİNDE İNDİREBİLME
R
9 yıl
Yüzbaşı
Konu Sahibi

" Kullanıcı bir dosya seçecek ve bu dosyayı ben veritabanına kayıt edecem istenildiği zaman kullanıcı bu dosyayı bilgisayarına indirecek ."Dosyadan kastım metin türleri ve resim dosyalarıdır. (.txt , .doc , .jpg , .jpeg ). Bu durumda aklıma takılan bazı yerler var ;
1-) Seçilen dosya veritabanına kayıt edilirken, veritabanındaki kayıt edeceğim alanın türü text mi olacak veya ne olmalı ?
2-) Projenin bulunduğu yere klasör açıp yüklenecek dosyaları oraya kaydetmeme gerek var mı?( Dosya kontrollerini yapabilirim dosyayı veritabanına da insertle kayıt ederim ama kayıt ederken dosyanın yolunumu kayıt edecem ya da başka bir klasöre kayıt edip veritabanına o klasörden mi kayıt edeyim orayı anlamadım.)
3-) Kullanıcıya dosyayı indirtmek istediğim zaman link bağlantısında nereyi adres olarak göstereyim ki kullanıcı tıkladığında kendisinin bilgisayarına dosya insin?

KISACASI VERİTABANINA DOSYA EKLEMEK VE ONU İSTENİLDİĞİNDE İNDİREBİLME İŞLEMİ NASIL OLUYOR ?

Yardımlarınızı bekliyorum.

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi reto -- 2 Şubat 2016; 15:55:29 >

M
9 yıl
Yüzbaşı

Anladigim kadariyla sen dosyalari fiziki olarak veritabanina kaydetmek mi istiyosun..



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
K
9 yıl
Yüzbaşı

verinin tipi "BLOB" olmalı (açılımı binary large object)
şurada bir örnek üzerinde çalışmışlar.
http://stackoverflow.com/questions/20556773/php-display-image-blob-from-mysql


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @reto
R
9 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: mckoray

Anladigim kadariyla sen dosyalari fiziki olarak veritabanina kaydetmek mi istiyosun..

Fizikiden kastınızı anlamadım ama istediğim şey ben bu projeyi internete yüklediğimde linke tıklandığında dosya insin istiyorum. Bildiğimiz dosya indirme siteleri gibi hemen hemen.


Bu mesaja 1 cevap geldi.
R
9 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: kirmik

verinin tipi "BLOB" olmalı (açılımı binary large object)
şurada bir örnek üzerinde çalışmışlar.
http://stackoverflow.com/questions/20556773/php-display-image-blob-from-mysql

verdiğiniz site malum ingilizce olduğundan fazla bir şey anlamadım ama
" header("Content-Type: image/jpeg");
echo $image; " şöyle bir kod gördüm bu kodu internette araştırırken tayfun erbilen'in de bir videosunu gördüm bu kodları yazıyordu heralde aradığım şey bu



M
9 yıl
Yüzbaşı

quote:

Orijinalden alıntı: reto

quote:

Orijinalden alıntı: mckoray

Anladigim kadariyla sen dosyalari fiziki olarak veritabanina kaydetmek mi istiyosun..

Fizikiden kastınızı anlamadım ama istediğim şey ben bu projeyi internete yüklediğimde linke tıklandığında dosya insin istiyorum. Bildiğimiz dosya indirme siteleri gibi hemen hemen.

Dosyayi upload yahut download ettireceksen sunucunda bi klasorde bulunmasi lazim...veritabanina sadece dosya yolunu kaydettirmelisin..ben bu sekilde yapiyorum...baska yöntem varmi bilmiyorum



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
R
9 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: mckoray


quote:

Orijinalden alıntı: reto

quote:

Orijinalden alıntı: mckoray

Anladigim kadariyla sen dosyalari fiziki olarak veritabanina kaydetmek mi istiyosun..

Fizikiden kastınızı anlamadım ama istediğim şey ben bu projeyi internete yüklediğimde linke tıklandığında dosya insin istiyorum. Bildiğimiz dosya indirme siteleri gibi hemen hemen.

Dosyayi upload yahut download ettireceksen sunucunda bi klasorde bulunmasi lazim...veritabanina sadece dosya yolunu kaydettirmelisin..ben bu sekilde yapiyorum...baska yöntem varmi bilmiyorum

Anladım bende veritabanında sadece, dosyanın kendi kaydettiğim klasörün içindeki yolunu kaydetmeyi düşünüyordum. Bu nedenle veritabanındaki alan türü text olması sıkıntı yaratmaz diye düşünüyorum.
Yükleme işleminde sorun yok fakat bir link verdikten sonra o linke tıklayınca kullanıcının bilgisayarına dosya inmiyor .
örneğin şöyle söyleyeyim bir txt dosyam var ve ben bu txt dosyamı link olarak kullanıcıya veriyorum linke tıklandığında txt dosyamın indirilmesi yerine internet tarayıcısında açıldığını gördüm. Bu sorunu nasıl çözeceğimi bilmiyorum.


Bu mesaja 1 cevap geldi.
N
9 yıl
Yarbay

En basit haliyle şu kodu kullanmak gerekir.

$dosya_ismi = 'resim.jpg';
header('Content-disposition: attachment; filename="'.basename($dosya_ismi).'"');
readfile($dosya_ismi);


Bu php koduyla resim.jpg aynı klasörde ise sorunsuz bilgisayara iner. Tarayıcıda gözükmez. Kod ile resim.jpg farklı klasörlerde ise onu da belirtmek gerekir.

Veritabanı da dahil örnek vereyim.

Resimlerin bulunduğu klasör sabit bir klasör ise veritabanına sadece resim.jpg gibi eklenebilir. Ancak resimlerin bulunduğu klasörde değişken alt klasörler de varsa veritabanına dosya yolunu da eklemek gerekebilir. Örneğin;

site.com/resimler/resim.jpg

şeklinde tüm resimler aynı klasörde ise veritabanına resim.jpg olarak eklenebilir.

site.com/resimler/012016/resim.jpg
site.com/resimler/022016/araba.txt
site.com/resimler/022016/deneme.txt
site.com/resimler/032016/bilgisayar.png

şeklinde alt klasörler de varsa o zaman veritabanında 012016/resim.jpg şeklinde bulunması iyi olur.

php kodu da

site.com/indir.php içinde olsun.

$dosya_ismi bu durumda

$dosya_ismi = "resimler/" . [VERİTABANINDAN_GELEN_İSİM];

olabilir.



< Bu ileti tablet sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @reto
R
9 yıl
Yüzbaşı
Konu Sahibi

Teşekkürler , anlamadigim bazi yerler var yazdığınız 4 satirlik kodda header ile başlayan ne işe yarıyor ?. Baseline ile başlayan satırda ne yapıyor ? Ayrica bu yazdığınız kodu nereye yazacam? Form bilgilerinin gittiği php dosyasina mi yazmaliyim?



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @nihattr
N
9 yıl
Yarbay

header ile başlayan kısım burada içerik düzeninin "ek" olduğunu belirtiyor. E-maillerdeki gibi ek dosya anlamında düşünülebilir. Yoksa tarayıcının uzantıyı açma özelliği varsa açmayı tercih eder.

baseline() fonksiyonu dosya yolu yazılsa bile dosyaismi.uzantı döndürür. Yani;

resimler/telefon.jpg olarak yazılan dosya ismi baseline fonksiyonu ile telefon.jpg olarak döner.

Form gönderildikten hemen sonra indirilmesi mi gerekiyor, yoksa indir linkine falan mı tıklanacak?



< Bu ileti tablet sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @reto
M
9 yıl
Yarbay

Dosyayi dosyalama sistemine kaydedip path'ini veritabanina kaydetmek bence daha dogru bir cozum.
Oracle BLOB a kaydedebilirsin, ya da kucuk bir dosya ise serialize edip string64 ile Varchar olarak kaydedebilirsin.



< Bu ileti tablet sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
R
9 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: Mephalay

Dosyayi dosyalama sistemine kaydedip path'ini veritabanina kaydetmek bence daha dogru bir cozum.
Oracle BLOB a kaydedebilirsin, ya da kucuk bir dosya ise serialize edip string64 ile Varchar olarak kaydedebilirsin.


Hmm anladım teşekkür ederim dosya kaydetme sırasında artık sorun yaşayacağımı sanmıyorum o kısmı anladım ama linke tıklayınca dosyayı indirme durumunu araştırıyorum.


Bu mesaja 1 cevap geldi.
R
9 yıl
Yüzbaşı
Konu Sahibi

Teşekkürler çok güzel açıklamışsınız. İndir linkine tıklayınca dosyanın inmesini istiyorum.Anladığım kadarıyla indir linkinde href kısmına sizin gönderdiğiniz bu kodları içeren bir sayfaya yönlendirecem ve böylece indirme işleminin yapmış olacam değilmi ?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @nihattr
N
9 yıl
Yarbay

Aynen öle olacak. Sadece kodların olduğu kısımda hangi dosyanın indirileceğini belirlemek için en azından $_GET dizisi ile dosya bağlantısı taşınması gerekcek. Yani;

<a data-test="test" rel="nofollow" style="word-wrap: break-word; text-decoration: underline;" target="_blank" onclick="return dhExternalLinkRedirect(this)" href="/ExternalLinkRedirect?module=pgdcode&messageId=114162176&url=indir.php?dosya=telefon.jpg" data-href="indir.php?dosya=telefon.jpg">İndir</a>

gibi. Eğer dosya yolu da olacaksa php için urlencode ve urldecode kullanma ihtiyacı olabilir. O zaman;

$indirme linki = '<a data-test="test" rel="nofollow" style="word-wrap: break-word; text-decoration: underline;" target="_blank" onclick="return dhExternalLinkRedirect(this)" href="/ExternalLinkRedirect?module=pgdcode&messageId=114162176&url=indir.php?dosya=' . urlencode(dosya_yolu/telefon.jpg) . '" data-href="indir.php?dosya=' . urlencode(dosya_yolu/telefon.jpg) . '">İndir</a>';

gibi olurken indirme kodunda en üste

$link = urldecode($_GET['dosya']);

eklenir. Tabi kullanıcılar dosya yolunu ve adını görüp izinsiz diğer dosyalara ulaşabilirler. Bunlar da hesaba katılmalı. Ayrıca güvenlik önlemleri de alınmalı.

Mesela site.com/resimler/telefon.jpg olsun.

İndirme koduna dosya yolunu siz telefon.jpg olarak ayarlarsınız. Normal olarak o iner; ama kullanıcı linkle oynayıp dosya yolunu ../index.php yaparsa geçmiş olsun. index.php kodlarını görür. ../ayar.php yaparsa belki veritabanı bilgilerini bulur. :D Burda güvenlikten bahsetmiyoruz, ama bunları hep hesaplamak lazım.




Bu mesajda bahsedilenler: @reto
R
9 yıl
Yüzbaşı
Konu Sahibi

Şimdi birşeylere takıldım hemen sormak istiyorum.

" <a data-test="test" rel="nofollow" style="word-wrap: break-word; text-decoration: underline;" target="_blank" onclick="return dhExternalLinkRedirect(this)" href="/ExternalLinkRedirect?module=pgdcode&messageId=114162731&url=indir.php?dosya=telefon.jpg" data-href="indir.php?dosya=telefon.jpg">İndir</a> " bu kodda href kısmında indir.php?dosya=telefon.jpg bölümünde "telefon.jpg" yerine veritabanın da indirilecek dosyayı çekip oraya mı koyacam ? Ayrıca dosya yolu olmadan oraya direk telefon.jpg şeklinde "?" 'den sonra belirtirsem dosyanın adresi bilinmediği için sorun çıkmaz mı , demek istediğim illa ki dosya yolunu yani klasorünü belirtmem lazım değilmi ?
Ve ayrıca dediğiniz güvenlik açığını nasıl kapatabilirim . Bazı sitelerde gördüğüm kadarıyla url kısmında hiç index.php gibi dosya adları yazmıyor onu uygulayabilirsem açığı kapatmış olabilirmiyim.
Gördüğüm şekil şu "http://www.siteadi.com/kurumsal ". diye url kısmı görünüyor . Veya başka bir bildiğiniz bu açığı kapatma yolu varmı?

Yada şöyle sorayım yapan nasıl yapıyor ? :D


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @nihattr
R
9 yıl
Yüzbaşı
Konu Sahibi

cevap yazdıktan sonra aklıma geldi sanki şimdi biraz idrak ettim. "<a data-test="test" rel="nofollow" style="word-wrap: break-word; text-decoration: underline;" target="_blank" onclick="return dhExternalLinkRedirect(this)" href="/ExternalLinkRedirect?module=pgdcode&messageId=114162889&url=indir.php?dosya=telefon.jpg" data-href="indir.php?dosya=telefon.jpg">İndir</a> " burada dosya değişkenine telefon.jpg yi atıyoruz ve bu dosya değişkenini indir.php de kullanacaz değilmi?

Bu arada bundan önceki mesajlarda da dedğiniz gibi "eğer dosyalarıda sabit bir klasöre kaydetmeyecekseniz veritabanına /0120156/telefon.jpg şeklinde kaydedin demiştiniz. Ben farklı klasörlere kaydetmeyi düşünmüyorum hepsi tek bir klasörde kayıt edilecek. Hepsini tek bir dosyada kaydedeceğime göre " <a data-test="test" rel="nofollow" style="word-wrap: break-word; text-decoration: underline;" target="_blank" onclick="return dhExternalLinkRedirect(this)" href="/ExternalLinkRedirect?module=pgdcode&messageId=114162889&url=indir.php?dosya=telefon.jpg" data-href="indir.php?dosya=telefon.jpg">İndir</a> " burada telefon.jpg den önce klasör ismini belirteyim mi ?


Bu mesaja 1 cevap geldi.
N
9 yıl
Yarbay

İlk mesajımda belirttiğim gibi bütün dosyalar, resimler falan tek klasörde olursa dosya yoluna gerek kalmaz, ancak dosya ismi belirtilir. Bazı siteler site.com/fsfdsdfsfdggfghhh/dosyaismi şeklinde araya karmaşık isimli klasör yolu gösteriyorlar. Bu var olmayan klasör. Muhtemelen .htaccess kullanarak bu linkler indirme kodu sayfasına yönlendiriliyor ve yine dosya ismini kullanıp gerekli dosya indiriliyor.

Bu şekilde açık kapanmaz. Ancak kafa karıştırır. Önemli olan kısım indirme kodunda önlem almak olur. Mesela kod içinde resimler/ klasörü kesin şart koşulur. Diğer dosya isimlerinin tahmin edilerek engellenmesi için de geçici şifre verilebilir veya dosya isimlerinin başında 34fg_dosyaismi.uzantı şeklinde kodlar olur. Kullanıcılarının birbiri arasındaki paylaşımını önlemek için dediğim gibi geçici şifre olabilir. Bu şifre dediğim site.com/fsfdsdfsfdggfghhh/dosyaismi kısmı olabilir. Tek kullanımlık olur.




Bu mesajda bahsedilenler: @reto
N
9 yıl
Yarbay

Bir sürü şey yazmıştım, site hata verdi, moralim bozuldu. :(

Dosyalar tek klasörde olacaksa diğer site kaynak dosyaların falan güvenliği belki de korunuyor, ama yine de son bir önlem daha almak gerekirse dosya yolu yazmaya kalkan kullanıcılar için hata verdirilebilir. Dosya yolunu bir üst klasöre taşımak isteyip ../ şeklinde yazan olursa indirme kodunda önce bunun kontrolünü yaparız.

if(preg_match('/../', $dosya_ismi)){
exit("Yanlış Dosya!");
}

Diğer dosya isimlerinin tahmin edilip indirilmesini önlemek için ise bence en iyi yöntem geçici şifre verilmesi. Bunun için de veritabanında yeni bir tablo oluşturmak iyi olur.

id - kullanıcı - dosya_ismi - indirme_sifresi - indirme_sayisi

İndirme linkini şu şekilde verebiliriz.

site.com/indir.php?dosya=$dosya_ismi&sifre=$indirme_sifresi

Ancak bu şekilde hoş görünmüyorsa .htaccess kullanılarak yönlendirme usülü bir şeyler yapılır.

site.com/$indirme_sifresi/$dosya_ismi

şeklinde güzel gözükür. İndirme kodunda veritabanında dosya ismi ve indirme şifresi eşleştirmesi yapılır. Olumluysa indirmeye izin verilir.

İndirme sayısı da indirme limiti koyulmak istenirse kullanılabilir.





< Bu mesaj bu kişi tarafından değiştirildi nihattr -- 4 Şubat 2016; 3:08:00 >

< Bu ileti tablet sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @reto
R
9 yıl
Yüzbaşı
Konu Sahibi

teşekkür ederim bu yazdıklarınızın hepsini araştıracam bundan sonrası bende :) Durum biraz karmaşık görünüyor ama dediğim gibi bundan sonrasını araştırmam gerek.
Bu ara başka bir projeyi araya koymam gerekti bu nedenle devam ettiğim proje yarım kaldı bu sorularda yarım kalan proje ile ilgiliydi.Bu nedenle bu yazdıklarınızı şuanda uygulamaya koyarsam işin içinden çıkamam. Demek istediğim bir süre geçecek ve ben bunları o zaman deneyecem. İşte o zaman büyük bir sorunla karşılaşırsam buradan soru cevaplara devam etmek istiyorum.
Büyük ihtimalle sorun çıkmayacağını düşünüyorum temeli aldım çünkü , gerisi internette araştırmaya kaldı.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @nihattr
R
9 yıl
Yüzbaşı
Konu Sahibi

Dün itibari ile yazdıklarınızı çözümleyip uygulamaya çalıştım ve başarılı oldum diyebilirim. POST metodu ile işlem yaptığımdan (url kısmında birşey görünmüyor ve post işlemini aynı sayfada yapmaktayım) başkası tarafından, url kısımından gelebilecek hamlelerini engelleyebildiğimi düşünüyorum.

Dosyayı yüklerken çeşitli kontrollerden geçiriyorum.( dosya tipi,dosya boyutu gibi ) . Uygulamayı test ederken bir sorunla karşılaştım lafı uzatmadan sorunumu yazmak isterim. FAzla boyutlu dosyaları yükleyip, butona bastığımda dosyanın boyutunu göremiyorum bunun yanı sıra dosyayı kaydetme işlemi de başarısız oluyor ama bana hiçbir hata vermiyor.(Fazla boyutlu dediğim 15 mb felandı) . Veya bazen normal boyutlu dosyaları yüklerkende php sayfama gönderiyor ama hiçbir eylem yok ? Acaba bu nedendir kaynak kodlarını gönderirsem belki bir hata vardır diye düşünüyorum.

 
if( $_FILES['dosya']['size'] == 0 ){echo 'DOSYA SEÇİNİZ';}
else{
if( $_FILES['dosya']['size']<20000000 ){
if($_FILES['dosya']['type']=="image/jpeg" or $_FILES['dosya']['type']=="image/png" or $_FILES['dosya']['type']=="application/msword" or $_FILES['dosya']['type']=="text/plain"){

$dosya_adi=$_FILES["dosya"]["name"];
$uret=array("as","rt","op","hd","et","cv","dl","az","fd","bv","jm","no");
$uzanti=substr($dosya_adi,-4);
$sayi_tut=rand(1,10000);
$yeni_ad=$uret[rand(0,11)].$sayi_tut.$uzanti;
if( move_uploaded_file($_FILES["dosya"]["tmp_name"],$yeni_ad) ){

echo 'DOSYA YÜKLENMESİ BAŞARILI ';
$sorgu=mysql_query("INSERT INTO resimler (img_path) values ('$yeni_ad')");

}else {echo 'DOSYA YÜKLENİRKEN BİR HATA OLUŞTU';}

}else{echo ' !! DOSYA TİPİ SADECE .jpeg/.png/.doc/.txt OLABİLİR ';}

}else{echo 'DOSYA BOYUTU 20MB'ı GEÇMEMELİ';}
}
}





< Bu mesaj bu kişi tarafından değiştirildi reto -- 8 Şubat 2016; 1:21:08 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @nihattr