Yüklenen fotoğraflar için kısa dosya adlarını oluşturmak nasıl?

9 Cevap

PHP ile bir linux sunucuya yeni fotoğraf yüklerken, ben (o dışladı dosya adı kullanarak) onlara benzersiz adlar vermek için yaşıyorum. Böylece benzersiz kimlikler almak da mümkün değildir DB ile hiçbir etkileşim yoktur.

I DATE+TIME.jpg kullanarak düşündüm, ama bu sadece çok uzun.

Yani PHP ile kısa benzersiz adlar oluşturmak için en iyi yöntem nedir?

9 Cevap

Kullan tempnam().

$filename = tempnam  ($dir, $prefix)

Bu belirtilen dizindeki benzersiz bir adla bir dosya oluşturur. Oluşturulan dosya adı oldukça kısa ve benzersiz olması için garantili.

Kısa güvenli bir şekilde uniqid() işlevini kullanmaktır.

Siz de kendi benzersiz 5 karakter klasör adları oluşturmak için bit.ly kullanımı gibi bu url shorteners karma aynı tür kullanabilirsiniz (örneğin, bit.ly/x3hs0).

There's an implementation in PHP here.

Bir dizin dosyası oluşturmak; Bu dosya bir dosya için kullanılan son kimliğini içerir. Yeni bir dosya oluşturulacak gerektiğinde:

  1. (OS destekliyorsa) endeksi dosyayı kilitlemek
  2. Kimliği Oku
  3. ID 1 ekle
  4. Dosyayı kaydedin
  5. Dosya kilidini
  6. Bu kimliği ile bir dosya oluşturun

regards,
Stijn

Peki, sorun, eşsiz ve kısa bir şey istiyor. Gerçekten ikisi de olamaz.

Insan okunabilir rastgele bir sayının yoğun gösterimi base64 (bir dosya olmamalı, herhangi bir karakter için yerine geçerli karakterler) gibi bir şey olurdu. Ancak hala dosya her karakter için "sadece" 64 varyasyonları vardır anlamına gelecektir.

Basit bir dosya adı istiyorsanız, sadece artan bir sayıda kullanmak ve (adı için minimum uzunluğu istiyorsanız ped dışarı) base64 kodlamak. Eğer non-guessable olmak istiyorsanız, bir rasgele sayı üreteci gerekir, ama sonra çiftler önlemek için emin olmak gerekir ya da dosyanın üzerine bitireceğiz. Felaket için bu şans isimler daha kısadır.

Muhtemelen bu kodlama tarafından sağlanan sadece 64 daha fazla karakter ile base64 kendi özel eşdeğer kullanabilirsiniz, ama sonra OS geçerli bir dosya adı ne düşündüğü kontrol etmek olurdu ve hala emin istemci erişebilir yapmak olurdu Düzgün (sadece geçici bir veri deposu değilse). Bunu yapmanın en kolay yolu ona okunaklı olmak istediğiniz her karakter ile bir dize oluşturmak ve sonra dize uzunluğu (eğer bilmiyorsanız temel dönüşüm açıklamalar Google'da vardır ne olursa olsun içine sayının tabanını dönüştürmek için bunu nasıl). Yani daha yüksek bilgi yoğunluğu ve sadece bile kısa dosya için izin verecek.

Ben her zaman dosyanın kendisi bir MD5 hash olarak dosya ayarlanır ne - bu yan etkisi yer alıyor yinelenen yüklenenler önler, artı oldukça kolay veri bütünlüğünü doğrulamak olduğunu.

Eğer daha kısa olmak istiyorsun Eğer sonu kapalı bit doğrama başlayabilirsiniz, ama daha bu daha bir dosya adı çarpışma riski yok, ancak tecrübe alarak ilk sekiz ya da öylesine karakterler genellikle çok yüklemek Yüklü sağlanan teklik garanti fazla.

Senin yerinde olsam ben sadece yaklaşık 6 karakter uzunluğunda rastgele bir sayı üretmek istiyorum, ve bu eşsiz kadar bir do {} (while) döngüde yapılacak.

Kısa iyi yol değildir. Ben size benzersiz dosya adını almak için md5 ($ date + $ zaman) işlevini kullanabilirsiniz düşünüyorum. 8d41627e46d5b8556d0d3e30ec15538e: Bu böyle olacak.

Eğer yüklenen dosyaların büyük saymak olacağını düşünüyorsanız Ayrıca, isimleri ile klasör ile dizin yapısını bölebilirsiniz, örneğin, md5 () karma ilk 2 harften oluşur:

8d/
  + 8d41627e46d5b8556d0d3e30ec15538e.jpg
  + 8d897234ed899a523c88273c009c12c2.jpg
ce/
  + ce2389898ace097cc667e134abb61729.jpg
...

Rastgele bir sayı ve tarih + saati schem kullanmak ve adını bir süre () döngü içinde olup olmadığını kontrol edebilirsiniz:

$new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;
while ( file_exists($path . $new_name) ) 
   $new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;

burada $new_name yüklenen dosyanın kısa adıdır

$extension sizin uzantısı dosya olduğunu (gibi. Jpg)

$path dosya kaydedilmiş olan dizinin tam yoludur

rand() artı microtime(true) ilk çekim için benzersiz bir ad bulmak için şans inscrease kullanımı ...