Nasıl onları üzerine yazılmasını önlemek için php yüklenen dosyaları isim?

5 Cevap php

Ben (sadece adminler için), benim web sitesine kullanıcı sunulan makaleler eklemek çalışıyorum. Her makale ile 3 adete kadar yüklemek için bir seçenek geliyor. Benim veritabanı bu gibi ayarlanır

Makaleler

id
user_id
title
body
date_added
last_edited

Fotoğraflar

id (auto_increment)
article_id

Önce veritabanında makaleyi kaydetmek, sonra ondan sonra ben article_id tasarrufu veritabanında yeni bir fotoğraf kaydı oluşturabilirsiniz fotoğraf (geçici) yükleyin. Sonra yüklenen fotoğraf fotoğraf kaydın birincil anahtar olarak aynı olacak şekilde yeniden adlandırın ve bir png olmak.

$filename = $photo->id . '.png';

Ben bu dosyaları formu üzerine önlemek için iyi bir yol olacağını düşündüm. Bu benim için kusurlu görünüyor. Benim kayıtları ve fotoğrafları kurtarmak gerektiğini konusunda herhangi bir öneriniz?

Teşekkürler

5 Cevap

Sadece dosya adına veritabanı birincil anahtarı kullanarak gerçekten yanlış bir şey yok.

Gördüğüm tek gerçek dezavantajı oldukça yararsız dosya ile sona olmasıdır. Birisi daha açıklayıcı adları vb arama motoru sıralaması, yardımcı olacağını yolda şikayet olabilir

Başka bir cevap belirttiği gibi,. Png sona bir dosyayı yeniden adlandırma bir png yapmaz. Sen PHP'nin bakmak isteyebilirsiniz yerleşik GD kütüphanesi (veya ImageMagick bakmak) aslında görüntü formatlarını dönüştürmek istiyorsanız.

Onları Hash.

Ben bir galeriye yükledi olduğu gibi görüntüleri karma PHP'nin MD5 fonksiyonunu kullandım. Bu iki önemli faydası vardır: farklı görüntüler birbirine özdeş görüntüleri üzerine yazmaz will. Yani her benzersiz resim benzersiz bir adı var anlamına gelir. , Yükleme kabul depolanan veri karma, dosya oluşturmak (hash.extension), varolan bir dosya için kontrol edin. Biri varsa, geçici dosyayı silmek ve sadece varolan kopyasını kullanabilirsiniz. Aksi takdirde, geçici dosyayı yeniden adlandırın ve tutmak. (Eğer başka bir yerde kullanımında bir dosyayı silmek yok emin olmak için) her dosya için bağlantı ne izlemek gerekebilir, ama tekrarlarına alan tasarrufu ve benzersiz isimleri almak için kolay bir yol olabilir.

Ayrıca, sadece PNG uzantısı kullanmak için dosyaları yeniden adlandırmak değil, PNG formatına dönüştürmek veya orijinal uzantısı kaydetmeniz gerekir. Yanlış uzantısını kullanarak bazı yerlerde, bazı tarayıcılarda sorun yaratabilir, ve genellikle sadece yanlış olabilir.

Bu değer ne için, burada ben varolan dosyaların üzerine yok emin olmak için benim dosya yükleme sınıfları dahil bir yöntem. Bu genel bir yöntem olmaya devam böylece ben, yükleme dosya adı ($ _FILES [$ img_field] ["name"]) ve parametre olarak içine dosyayı kaydetmek için dizin geçmek.

 private function unique_file_upload($filename, $dir) {
      $filename = preg_replace("/[^.\w]/",'_',$filename);
      $filename = preg_replace("/__+/",'_',$filename);
      preg_match("/^(.*)\.(\w{2,4})$/",$filename,$f);
      if ( file_exists( $dir . $filename ) ) {
          $num = 1;
          while ( file_exists( $dir . $filename ) ) {
              preg_match("/^(.*)\.(\w{2,4})$/",$filename,$f);
              preg_match("/(\d+)$/",$f[1],$n);
              if ($n[1]) {
                  $x = $n[1];
                  $num = $n[1] + 1;
                  $num .= '.';
                  $filename = preg_replace("/$x\./",$num,$filename);  
              }
              else {
                  $filename = $f[1] . $num . '.' . $f[2];
              }
          }
      }
      return $filename;
  }

Görüntü adı olarak otomatik artışlı birincil anahtarı kullanıyorsa, aynı ada sahip iki görüntü olmama olasılığı kesinlikle yoktur.

Karma veya adına teklik sağlamak için ekstra bir şey yapıyor değersiz. Hatta daha fazla, DB ekstra bir görüntü adı alanını ekleyerek anlamına gelecektir.

Görüntüler overwrited alabilir tek yolu DB otomatik artış sayacını sıfırlamak olduğunu ve tablo veya tezgahın üzerine önceki kayıtları silmek gerekir yapmak için masaya yüksek id kayda DBMS tarafından yeniden hesaplandığında alacağı .

Diğer bir deyişle, sizin algoritması kullanarak, aynı isimde iki görüntü olmaz.

Uygun şekilde ilişkili kaydın birincil anahtar kimliği ile dosyaları saklamak için. Işlemek için "ama o zaman sadece işe yaramaz bir rakam" sen "fotoğraflar" tablosunda orijinal dosya saklayabilirsiniz. Birden fazla resim türlerini sağlayan ediyorsanız, aynı zamanda, mim türünü saklayabilir.

Daha sonra veritabanından dosyanın adını almak ve bir Content-disposition: attachment; filename=$filename başlığı ile istemciye hizmet ediyorum, basit bir komut dosyası kullanabilirsiniz. Bu şekilde, sunucu üzerinde dosya (diyelim ki) "3527" olsa bile, müşteri "originalimagefilename.jpg" ya da ne olursa olsun bir indirme göreceksiniz.