Yazdır 09 Mayıs 2010 Pazar (Hit: 17338)

Dosya Yükleme (File Upload)

PHP ile dosya yüklemek oldukça kolaydır. Dosya yükleme formunda metot olarak POST metodu kullanılır ve <form>...</form> etiketlerine enctype="multipart/form-data" özelliği eklenir.

Yüklenecek dosyayı seçmek için <input type="file" name="form_adi"> formu kullanılır.

Aşağıda örnek bir dosya yükleme formu vardır. İnceleyiniz.

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="yukle.php" enctype="multipart/form-data">
      Yüklenecek Dosyayı seçiniz: <input type="file" name="dosya"><br>
      <input type="submit" name="yukle" value="Yükle">
   </form>
</body>
</html>

Dosya seçildikten sonra yüklemenin yukle.php sayfasında yapılacağı action özelliğinde görülmektedir.

Sunucuya yüklenen bütün dosyalar geçici olarak yüklenmektedir. Bunun sebebi dosyayı kalıcı olarak yüklemeden önce özelliklerine bakmaktır. Geçici olarak yüklenen dosyanın türüne, boyutuna, adına ve daha önce yüklenip yüklenmediğine bakarsınız, eğer tüm bunlar sizin istediğiniz gibiyse bu dosyayı kalıcı olarak sunucuda istediğiniz dizine kaydedersiniz. Kalıcı olarak kaydedilmeyen dosyalar ise zaman içinde sunucudan kendiliğinden silinecektir.

Şimdi geçici olarak yüklenen dosyanın yukle.php sayfasında ne gibi özelliklerine bakacağımıza ve bunu kalıcı olarak nasıl kaydedeceğimize bakalım.

Yüklenen dosyayla ilgili özelliklere ulaşmak için iki boyutlu $_FILES dizisi kullanılır. Bu dizinin birinci boyutunun indisi dosyanın seçildiği formun adı yani name değeridir (name="dosya"). İkinci boyutunun indisleri ise sabittir ve aşağıda verilmiştir.

$_FILES["dosya"]["name"] > "dosya" isimli form elemanından yüklenen dosyanın gerçek adıdır.
$_FILES["dosya"]["tmp_name"] > "dosya" isimli form elemanından yüklenen dosyanın geçici adıdır.
$_FILES["dosya"]["type"] > "dosya" isimli form elemanından yüklenen dosyanın türüdür.
$_FILES["dosya"]["size"] > "dosya" isimli form elemanından yüklenen dosyanın byte olarak boyutudur.
$_FILES["dosya"]["error"] > "dosya" isimli form elemanından yükleme yaparken oluşan hatadır.

Unutmayınız aynı anda birden fazla dosyayı upload edebilirsiniz. Şimdi yukle.php sayfasında yüklenen dosyanın özelliklerini ekrana yazdıralım.

<!--yukle.php-->
<html>
<body>
<?php
echo "<b>Yüklenen dosyanın adı:</b> ",$_FILES["dosya"]["name"],"<br>";
echo "<b>Yüklenen dosyanın geçici adı:</b> ",$_FILES["dosya"]["tmp_name"],"<br>";
echo "<b>Yüklenen dosyanın türü:</b> ",$_FILES["dosya"]["type"],"<br>";
echo "<b>Yüklenen dosyanın boyutu:</b> ",$_FILES["dosya"]["size"],"<br>";
echo "<b>Varsa yüklerken oluşan hata:</b> ",$_FILES["dosya"]["error"],"<br>";
?>
</body>
</html>

Yukarıdaki yukle.php sayfasında sadece, geçici olarak yüklenen dosyanın özellikleri ekrana yazdırılmıştır. Bu özellikleri kontrol ederek istenirse dosyayı kalıcı olarak kaydedebilirsiniz.

Bir dosyayı kalıcı olarak kaydetmek için move_uploaded_file($p1, $p2); fonksiyonu kullanılır. Bu fonksiyon iki parametre alır.

$p1 > Dosyanın geçici adıdır. Buraya $_FILES["dosya"]["tmp_name"] ifadesi yazılır.
$p2 > Dosyanın kalıcı yolu ve adıdır. Buraya ise istediğiniz bir yolu ve adı yazabilirsiniz.

Dosyaları kalıcı olarak kaydederken aşağıdaki sorunlardan birini yaşayabilirsiniz. Bunlara dikkat ediniz.

  • Yüklenen dosyanın boyutunun çok büyük olması. Sunucuda php.ini dosyasında izin verilen boyuttan daha büyük bir dosya yüklemeye çalışmak.
  • Dosyayı kalıcı olarak istenen dizine kaydederken kayıt izninin olmaması. Bunu, dizine yazma iznini vererek aşabilirsiniz.
  • Dosyaya verilen kalıcı adın daha önce kullanılmış olması başka bir ifadeyle aynı dosyayı tekrar yüklemeye çalışmak. Bunu, dosyaya farklı bir ad vererek aşabilirsiniz. Yada baştan file_exists($dosya_adi) fonksiyonu ile dosyanın var olup olmadığına bakabilirsiniz.
  • Dosyayı kaydederken dosya adında Türkçe'ye özgü karakterlerin ve geçersiz karakterlerin kullanılması (çÇğĞıİöÖşŞüÜ). Bu sorunu Türkçe karakterleri temizleyen bir fonksiyon tanımlayıp kullanarak aşabilirsiniz.

 

Örnek: Seçilen dosyayı kendi adıyla upload isimli dizine yükleyen php sayfalarını hazırlayalım. Web dizininda upload isimli bir dizin yoksa oluşturunuz ve yazma izni veriniz.

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="yukle.php" enctype="multipart/form-data">
      Yüklenecek Dosyayı seçiniz: <input type="file" name="dosya"><br>
      <input type="submit" name="yukle" value="Yükle">
   </form>
</body>
</html>
<!--yukle.php-->
<html>
<body>
<?php
$gecici_ad=$_FILES["dosya"]["tmp_name"];
$kalici_yol_ad="upload/".$_FILES["dosya"]["name"]; // dosya kendi adıyla upload dizinine kaydedilecek

if (move_uploaded_file($gecici_ad,$kalici_yol_ad)) // eğer dosya kaydedilirse
   echo "Dosya başarı ile yüklendi.";
else
   echo "Yükleme başarısız!";
?>
</body>
</html>

Bu örnekte dosya, hiçbir özelliğine bakmaksızın upload dizinine kaydediliyor.

 

Örnek: Daha önce yüklenmemiş olan jpg resimlerini kendi adlarıyla upload dizinine yükleyelim.

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="yukle.php" enctype="multipart/form-data">
      Jpg resmi seçiniz: <input type="file" name="dosya"><br>
      <input type="submit" name="yukle" value="Yükle">
   </form>
</body>
</html>
<!--yukle.php-->
<html>
<body>
<?php
$gecici_ad=$_FILES["dosya"]["tmp_name"];
// dosya kendi adıyla upload dizinine kaydedilecek
$kalici_yol_ad="upload/".$_FILES["dosya"]["name"];

if (file_exists("upload/".$_FILES["dosya"]["name"])) // yüklenen dosya upload dizininde varsa
   echo "Seçtiğiniz dosya daha önce yüklenmiştir.";
else{
      if ($_FILES["dosya"]["type"]=="image/jpeg"){
         if (move_uploaded_file($gecici_ad,$kalici_yol_ad)) // eğer dosya kaydedilirse
            echo "Dosya başarı ile yüklendi.";
         else
            echo "Yükleme başarısız!";
      }
      else
         echo "Lütfen jpg resmi seçiniz.";
}
?>
</body>
</html>

 

Örnek: Aşağıdaki şartlar sağlanırsa dosyayı kendi adıyla upload dizinine yükleyelim.

-Hata oluşmazsa
-Dosya daha önce yüklenmemişse
-Dosya gif dosyası ise

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="yukle.php" enctype="multipart/form-data">
      Gif resmi seçiniz: <input type="file" name="dosya"><br>
      <input type="submit" name="yukle" value="Yükle">
   </form>
</body>
</html>
<!--yukle.php-->
<html>
<body>
<?php
$gecici_ad=$_FILES["dosya"]["tmp_name"];
$kalici_yol_ad="upload/".$_FILES["dosya"]["name"]; // dosya kendi adıyla kaydedilecek

if ($_FILES["dosya"]["error"]) // hata oluştu ise
   echo "Hata : ",$_FILES["dosya"]["error"];
else{
      if (file_exists("upload/".$_FILES["dosya"]["name"])) // yüklenen dosya upload dizininde varsa
         echo "Seçtiğiniz dosya daha önce yüklenmiştir.";
      else{
         if ($_FILES["dosya"]["type"]=="image/gif"){
            if (move_uploaded_file($gecici_ad,$kalici_yol_ad)) // eğer dosya kaydedilirse
               echo "Dosya başarı ile yüklendi.";
            else
               echo "Dosya yükleme başarısız!";
         }
         else
            echo "Lütfen gif resmi seçiniz.";
      }
}
?>
</body>
</html>

 

Örnek: Aşağıdaki şartlara göre kullanıcının seçtiği dosyayı kullanıcının yazdığı ad ile upload dizinine kaydeden php sayfalarını hazırlayalım.

-Hata oluşmazsa
-Dosya daha önce yüklenmemiş ise
-Dosya pdf dosyası ise
-Dosya boyutu 500 KB'dan küçük ise

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="yukle.php" enctype="multipart/form-data">
      <table border="0">
         <tr>
            <td>Dosyanın Kalıcı Adı:</td>
            <td><input type="text" name="kalici_ad"></td>
         </tr>
         <tr>
            <td>PDF Dosyası Seçiniz:</td>
            <td><input type="file" name="dosya"></td>
         </tr>
         <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="yukle" value="Yükle"></td>
         </tr>
      </table>
   </form>
</body>
</html>
<!--yukle.php-->
<html>
<body>
<?php
$gecici_ad=$_FILES["dosya"]["tmp_name"];
$kalici_yol_ad="upload/".$_POST["kalici_ad"].".pdf";

if ($_FILES["dosya"]["error"]) // hata oluştu ise
   echo "Hata : ",$_FILES["dosya"]["error"];
else{
   if (file_exists($kalici_yol_ad)) // yüklenen dosya upload dizininde varsa
      echo "Yazdığınız ad ile bir dosya zaten kayıtlıdır.";
   else{
      if ($_FILES["dosya"]["size"]>500*1024)
         echo "500KB'dan küçük bir dosya seçiniz.";
      else{
         if ($_FILES["dosya"]["type"]=="application/pdf"){
            if (move_uploaded_file($gecici_ad,$kalici_yol_ad)) // eğer dosya kaydedilirse
               echo "Dosya başarı ile yüklendi.";
            else
               echo "Dosya yükleme başarısız.";
         }
         else
            echo "Lütfen PDF dosyası seçiniz.";
      }
   }
}
?>
</body>
</html>

 

Örnek: Şimdi tam bir dosya yükleme örneği verelim. Burada dosyalar kendi adlarıyla upload dizinine kaydedilecektir. Tabiki Türkçe'ye özgü karakterler temizlendikten sonra. Bunun için bir fonksiyon tanımlayıp kullacağız. Ayrıca yükleme aynı sayfada yapılacaktır.

<!--index.php-->
<html>
<body>
   <form name="yukleme" method="post" action="index.php" enctype="multipart/form-data">
      <table border="0">
         <tr>
            <td>Dosya Seçiniz:</td>
            <td><input type="file" name="dosya"></td>
         </tr>
         <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="yukle" value="Yükle"></td>
         </tr>
      </table>
   </form>

<?php
function turkce($metin){
   $aranan=array("ç","Ç","ğ","Ğ","ı","İ","ö","Ö","ş","Ş","ü","Ü"," ");
   $yerine=array("c","c","g","g","i","i","o","o","s","s","u","u","_");
   return str_replace($aranan,$yerine,$metin);
}

if($_POST){
   $gecici_ad=$_FILES["dosya"]["tmp_name"];
   $kalici_yol_ad="upload/".turkce($_FILES["dosya"]["name"]);

   if ($_FILES["dosya"]["error"]) // hata oluştu ise
      echo "<font color='green'>Hata : ",$_FILES["dosya"]["error"],"</font>";
   else{
      if (file_exists($kalici_yol_ad)) // yüklenen dosya upload dizininde varsa
         echo "<font color='red'>Yazdığınız ad ile bir dosya zaten kayıtlıdır.</font>";
      else{
         if (move_uploaded_file($gecici_ad,$kalici_yol_ad)) // eğer dosya kaydedilirse
            echo "<font color='green'>Dosya başarı ile yüklendi.</font>";
         else
             echo "<font color='red'>Dosya yükleme başarısız.</font>";
      }
   }
}
?>
</body>
</html>

 

PHP'de dosya türlerine karşılık gelen ifadeler için http://www.w3schools.com/media/media_mimeref.asp adresini kullanabilirsiniz.


Bu site meslek liselerinde bilişim bölümü web programcılığı dalında okutulan internet programcılığı dersine yardımcı olması için tasarlanmıştır. İletişim için iletisim@phpdefteri.com
Apache PHP MySQL PhpMyAdmin EasyPHP Xampp AppServ Wamp W3School

www.phpdefteri.com © 2010