Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Form nesnesi hakkında...

Konu, 'PHP' kısmında sinankaya tarafından paylaşıldı.

  1. sinankaya

    sinankaya Yeni Üye

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    9
    Beğenilen Mesajlar:
    0
    Meslek:
    offfffff
    :confused:
    Bir php sayfasından resim dosyası upload etmek istiom.Ancak resim upload olmadan once gonderen resime bi baksın sonra gondersin diyom(mumkunse aynı sayfada) . Bunun için bir Form nesnesi olusturdum, 2 submit bir file input nesneleri var. Soyle ki :

    <FORM method="post" action="<?php echo $PHP_SELF ?>" enctype="multipart/form-data">
    <INPUT type="file" name="resim" >
    <INPUT type="submit" name="goster" value="Bu resmi goster">
    <INPUT type="submit" name="gonder" value="Bu dosyayı servera gonder">
    </form>

    sonrada
    <?
    if ($goster){ ?>
    <td colspan="3"><img src="<? echo "$img1" ?>"> </td>
    <? }
    if ($gonder){
    copy ($resim,"./resimler/$resim_name")
    }?>
    gibi basit bir yontemle goster ve gonder diyorum.
    Gel gor ki goster deyince resim gosteriliyor iken gonder deyince post ile gelen bilgiler silindiği için gonderecek bişi bulamıyo.resmi secip gostermeden gonder oluyo.Anlayacagınız iki buton aynı anda çalışmıyor.
    Formdan gelen bilgiyi nasıl saklayıp ikinci submitte aktarabilirim?
    Yada başka bir cozum mevcut mudur?

    Teşekkürler...

    Off yaaa offfffffff of of olmuyo diyin olmasın olamasın... ben bilmiyom...(çizdim galiba)
    :D
     
  2. Sahin

    Sahin Daimi Üye

    Kayıt:
    28 Mayıs 2002
    Mesajlar:
    8,943
    Beğenilen Mesajlar:
    0
  3. mkarabulut

    mkarabulut Misafir

    Çözüm biraz Javascript...
    Şu JavaScripttimiz olsun
    Kod:
    <script>
    function gonder(str){
            document.forms[0].action.value=str;
            document.forms[0].submit();       
    }
    </script>
    
    formuna bir tane hidden alan ekle..
    Kod:
    <input type=hidden name=action value="">
    
    Sonra butonların şöyle değiştir
    Kod:
    <input type=button value=' göster ' OnClick="gonder('goster')" >
    <input type=button value=' Gönder ' OnClick="gonder('gonder')" >
    
    Kolay gelsin...
     
  4. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    Unutma global değişkenler güvenlik açıkları yaratır ve bazen çalışmazlar herzaman $_POST kullan :D
     
  5. sinankaya

    sinankaya Yeni Üye

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    9
    Beğenilen Mesajlar:
    0
    Meslek:
    offfffff
    Evet şu glabal değikenler bazen kesinlikle çalışmıyorlar ustad LoS.ToF...
    Daha kötüsü benim bu uğraştığım zimbirti çalışmıyor.

    Büyük üstad Mustafa Karabulut'un da Javasrcipt yöntemi de bi işe yaramadı yada ben beceremedim.

    Form nesnesi bi kere submit yiyince file nesnesi ile gelen bilgiler yok oluyor. Mustafa Karabulut yazısında "file upload" yazısında belirmiş:

    "...
    Unutulmaması gereken nokta upload edilen dosyanın HTTP POST değişkenleri içindeki değerlerinden başka fiziksel olarak da yer tutmasıdır. Yani programcı upload kontrolünden sonra dosyayı istediği bir klasöre veya veritabanına kaydetmelidir. Aksi takdirde scriptin çalışması bitince PHP geçici dizindeki dosyaları silmektedir.
    ... "

    Yani resmi gostermek için submit edince bi daha resim dosyasının bilgilerine ulaşılamıyor. Şimdi en azından file nesnesinden gelen dosya adını bir hidden alan ile aktarsam (guvenlik onemsiz) olur mu?
    bir hidden alandan nasıl faydalanırım ?(bunu bilmiyorum hiç)
    Bana bu konuda yardım edebilirmisiniz?
    şimdiden teşekkürler...
     
  6. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    Amacın resmi göstermek ise bunu js ile rahatlıkla yapabilirsin....

    document.write img tagını yazdırırsın...

    Kod:
    resim = document.all.resim.value;
    document.write('<img name="x" src="'+resim+'">");
    
    eğerki bi form içinde kullanıyorsan "all" ı dökümanının ismiyle değiştir...
    sanırım bunun gibi bişiler olucaktı...
     
    Son düzenleme yönetici tarafından yapıldı: 21 Ekim 2002
  7. mkarabulut

    mkarabulut Misafir

    Sanırım güvenlik sebeplerinden dolayı file türündeki form elemanları öntanımlı bir value değeri alamazlar. Yani
    bu dosya ismini hidden veya öntanımlı bir file elemanı olarak gönderemeyeceğin anlamına geliyor.
    Yoksa düşünsene sana bağlanan her kişinin atıyorum c:\windows\parola.txt dosyasını ondan habersiz server'a yükleyebilirsin. E tabi ki buna izin verlmiyor...

    Herneyse,benim metodun işe yaramayacağı doğru çünkü upload olduktan sonra dosya silinir. Ama şöyle bi şey yapabilirsin.
    Mesela sende geçici bi klasör belirleyip,gösterilmek için seçilen dosyaları oraya atarsın. Eğer kullanıcı vazgeçerse o dosyayı silersin,yok vazgeçmezse o dosyayı asıl yerine kopyalarsın.

    1. Gönder deyince herşey düzgün zaten
    2. Göster deyince önce senin belirleyeceğin geçici bi klasöre atacaz dosyayı,yalnız atarken bi numara yapacaz..
    Kod:
    if (is_uploaded_file($file)){
       $name=((string)time()).$file_name;
       move_uploaded_file($file,"/gecici_klasor/$name");
    }
    
    Dosyanın asıl ismini değilde dosyanın önüne upload edildiği zamanıda ekliyoruz. Sebebi ise daha sonra geçici klasörde kalan gereksiz dosyaları temizlemek için bir rutin yazacaz.
    Yani bi nevi garbage collector...
    Geçici klasöre attıktan sonra yapman gereken kullanıcıya bu resmi kullanmayı isteyip istemediğini sorman:
    Kod:
    <script>
    function formSubmit(act){
     document.forms[0].action.value=act;
     document.forms[0].submit();
    }
    </script>
    
    <center>Bu resmi kullanmak istiyormusun ?</center>
    <form action=son.php method=POST>
    <input type=hidden name=action value="">
    <input type=hidden name="dosya" value=<? echo $name;?>>
    <input type=button value=" Hayır,vazgeç" OnClick="formSubmit('hayir')">
    <input type=button value=" Evet kullan" OnClick="formSubmit('evet')">
    </form>
    
    Bu formdan gelen değerleri ise son.php halledecek...
    Kod:
    if (getenv("content_length")!=0){
        $action=@$_POST["action"];
        $dosya =@$_POST["dosya"];
        if ($action=="hayir"){
             unlink("/gecici_klasor/$dosya");
             header ("Location:formupload.php");//Mesela yani
             die;
        } else {
             //dosya ismini normale döndür
             $name=eregi_replace("^([0-9]{10})","",$dosya);
             //asıl yere kopyala
             copy("gecici_klasor/$dosya","resimler/$name");
             unlink("gecici_klasor/$dosya");
        }
        gb();
    }
    
    Şimdi şöyle bi durum var,vazgeç denildiğinde geçici dosyalar siliniyor ama ziyaretçiler her zaman vazgeç demeyebilir,doğrudan tarayıcıyı kapatabilirler.
    Onun için gb() isimli bir fonksiyonumuz her düzgün upload işlemi sonunda eski dosyalraı bulup silecek.Bi nevi çöp temizliği yani..
    Kod:
    function gb($time_limit=-1){
     //-1 tüm dosyaları sil
     //her hangi bi sayı n dakika öncekileri sil
     $dir=opendir('gecici_klasor/');
     while($file=readdir($dir)){
         if ($file!='.' || $file!='..'){
             if (eregi("^([0-9]{10})",$file,$regs)){
                if ($time_limit==-1) unlink('gecici_klasor/'.$file);
                elseif (intval($regs[1])<time()-($time_limit*60))
                unlink('gecici_klasor/'.$file);
             }
         }
     }
    }
    
    Sanırım işine yarayacak bir fikirdir,kodlardan tam emin değilim ama en azından algoritma olarak düşünebilirsin.
    Beni biraz zorladı :)
    kolay gelsin.
     
  8. LoS.ToF

    LoS.ToF Daimi Üye

    Kayıt:
    11 Ağustos 2002
    Mesajlar:
    1,088
    Beğenilen Mesajlar:
    0
    Meslek:
    PHP Developer
    Şehir:
    Antalya
    Mustafa yalnız bu olayların safe mode kapalı serverlarda işe yarabileceğini söylemekte yarar var.

    Ayrıca online ol :D
     
  9. mkarabulut

    mkarabulut Misafir

    Safe_mode=off ise çalışır ama
    safe_mode=On ikende çalışabilir,yalnız dikkatli olunursa...

    (Online olamıom,bizim patron işte... :D )
     
  10. sinankaya

    sinankaya Yeni Üye

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    9
    Beğenilen Mesajlar:
    0
    Meslek:
    offfffff
    :super:
    Nihayet muradıma erdim. :)
    Sonunda çalıştı. bir kaç gün ara vermek zorunda kaldığım tek sayfada form nesnesi ile resim seçen -gosteren ve upload eden zımbırtı çalıştı. Şimdi bunu birde mysql'le birleştirecem ki orasını zaten yapmıştım.
    Bu konuda yardımlarını esirgemeyen arkadaşlara ve özellikle Mustafa Karabulut'a çok teşekkür ediyorum.

    Tüm ustadlara saygı, sevgi ...
     
  11. sinankaya

    sinankaya Yeni Üye

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    9
    Beğenilen Mesajlar:
    0
    Meslek:
    offfffff
    Bu arada unuttum yaw!
    Mustafa yukarıda yazdıgın code mantığı kesinlikle dogru.Ancak tam olarak tümünü deneme fırsatım olmadı, sanırım çalışır.
    Js kullanmadan da bu gerçekleşiyor o yuzden onları atladım (zaten js ile ben pek bilişemiyoruz bi arada ona bakmak gerek)

    Herkese kolay gele...