Nasıl benim Projesi benim Görüntüler kaydetmeniz gerekir?

6 Cevap php

Bu yapmak istediğim budur ............

I am going to let each user upload multiple images into a folder called "pics". If the user upload say "MyImage.jpg" i will rename it "MyImage_UserID.jpg". Where UserID will be the User's unique ID of course. This way when i look for all the images of a user i will just look for the image name that ends with the UserID.

Bu yanlış, ya da bunu yapmanın başka bir yolu var mı?

Ben 1 klasördeki tüm kullanıcıların TÜM görüntüleri yerleştirerek düşünüyorum.

Eğer dont düşünmek her kullanıcı için bir klasör oluşturmak için aptal olacak?

Ayrıca, bu klasör "resimlerim" nasıl tasarruf olacak? I gibi hackerlar bu klasörün dışında resim eklemek veya silmek istemiyorum.

Herhangi bir giriş?

6 Cevap

Lütfen Dosya Sistemi (sağlanan bu dosyalar çok sayıda işlemek için mümkün olan kaza olmayacak) boğmaya başlar, kullanıcı başına görüntülerin önemli miktarda kullanıcıların bazı önemli sayıda olacak sağladı.

Ne tavsiye her kullanıcı için bir klasör oluşturmak için. Ve hayır, bu aptal değil.

Tek bir dizin çok fazla dosya depolama sorunlarına yol açabilir. performansı sadece belli bir noktada, ama yaşayacaktır (benden çok daha fazla deneyime sahip) bir arkadaşım bazı yedekleme programları ile bu sorunları olduğunu söyledi.

bu yüzden binlerce görüntü ben hep dizindeki dosyaları 256 alt dizinleri oluşturulur ve depolanan saklamak zorunda files/{id mod 256}/{myfile_id}.jpg

korsanlara karşı kendinizi korumak için orada yapmak için bir çok şey vardır ve (hacker büyük olasılıkla root erişimi elde etmek için çalışacağız ve sonra veri zaten güvenli değil çünkü) hiçbir şey güvende olacak.

1) so ... regular backups. period.
2) audit log files (who what when). that's not security per se, but may help you in discovering security holes and fix bugs
3) set the file permissions accordingly (important on shared servers without chroot-ing)
4) double-check if an action really is done by the right user. it must be impossible to do harm by guessing the url.

Eğer dosya isimleri ve yolları-gizli yapmak istiyorsanız daha fazla var. örneğin doğrudan bu görüntüyü veren bir komut ama, resme link değil mümkündür. Bu durumda size webroot dışında dosyaları saklamak mümkün olacaktır (ayrıca, sizin dosya daha bağımsız) (sonunda kod bakın).

bir adım daha görüntüleri tanımlamak auto_increment id değerlerini önlemek olacaktır. (youtube ve flickr bunu afaik) daha iyi id bir ilişki olmadan benzersiz bir karma (md5(mt_rand());) kullanın ve veritabanında bu saklayın.

geçerek çirkin php-yalancı gibi bir şey olurdu:

<?php
  if (isset($_REQUEST['img'])) {
    $hash = $_REQUEST['img']);
    if (($res = getImageByHash($hash)) !== false) {
      list($id, $name, $mimetype) = $res;
      $path = '../images/' . ($id % 256) . '/' . $name;

      if (file_exists($path)) {
        header('Content-type: ' . $mimetype); // e.g. image/png
        readfile($path);
    	exit();
      }
    }
  }

  // if any error happened, then 404 - it's dirty
  header("HTTP/1.0 404 Not Found");
  echo 'sorry, we couldn\'t find this image';
?>

getImageByHash() would query the db. this solution is slower, because the webserver can't serve images directly anymore.

ve: Ben oldukça veritabanında görüntüleri saklamak istemiyorum. ihracatın büyük alacağı, bir ağrı yedeklemeler.

Bu bir dizindeki tüm görüntüleri saklamak için iyi bir seçenek değildir. Bunun içinde birçok düğümlerin varsa dosya sistemi şok olacaktır.

İlk seçenek her kullanıcının kendi dizini vermektir. Eğer birçok kullanıcı bekliyoruz ama eğer aynı sorun sonunda ortaya çıkacaktır.

Insanlar genellikle ile gelip bir şey: UserID bölmek:

+ 1
|- 11
|- 12
|- 1490
+ 2
|- 23
|- 240
...

Ama sonra veri not distributed evenly diğer sorunlara yol açan, dizin yapısını yalak.

Basit çalışma çözüm arkasından UserID bölmek için:

+ 1
|- 231
|- 91
|- 1
+ 2
|- 6322
|- 342
...

But there are better solutions out there.
See also: How to store images in your filesystem for a more complex solution

The next thing to worry about is: how do I keep the database and my file-system synchornised

  1. '-senkronize değil' olarak işaretlenmiş DB kayıt oluşturmak,
  2. yeni eklenen kaydın id getir
  3. yeni eklenen recordID bağlı dosya sisteminde, veri depolamak
  4. 'senkronize' olarak kaydını işaretlemek

Şeyler silme etrafında otherway gider.

Herhangi bir dizin listeleme önlemek için web sitesinde güvenlik seti izinleri ile yardımcı olmak için. Böylece birisi doğru bir klasörün adını tahmin başarıyor bile onlar içeriğini görmek mümkün olmayacaktır.

Site güvenliği hakkında biraz araştırma yapmak - yapabileceğiniz başka şeyler vardır.

Ben Anton katılıyorum, kullanıcı başına bir dizin iyi bir fikirdir. Sonra bile görüntüyü yeniden adlandırmak zorunda değilsiniz.

sadece tüm resimlerinizi upload 1 tek klasör var ve kimliği ve GörüntüDosyaAdı günlükleri ayrı bir tablo var

u görüntüleri yüklerken kontrol etmek için gereken tek şey, evet, yeniden adlandırın ve buna göre kaydedin eğer aynı görüntü dosya adı, var olup olmadığı

Eğer dosya sistemi üzerinde resimlerinizi kurtarmak için seçerseniz bu


ancak veritabanları Tüm bu bu gün gerçekten çok iyi olduğunu unutmayın. böylece doğrudan SQL Server ölçeklenebilirlik içinde görüntü kaydetmek bile hiç bir sorun olmamalı. Eğer tamamen görüntüleri güvenceye bu şekilde, yeniden adlandırma görüntüler için gerek yok, yönetmek dosya sistemi, vs vs

Burada çocuklar bir sürü bu konuda iddia ediyorum. ancak (bir dosya sistemi üzerinde elde etmek için onun çok çok zor o zaman, sharepoint 2007 Hiç kullanıcıların bir çok sahip sona varsa da vs vs belgeleri, görüntüleri kaydetmek için SQL Server kullanır ve u yük dengeleme ve son çareye gerekir lütfen unutmayın ) bir ağ paylaşımına güveniyor ve geri sonbaharda için ağ paylaşımı çoğaltmak zorunda kalacak

ancak SQL Server ile ulaşmak için aynı görevi bir esinti olur

Eğer güvenlik konusunda emin değilseniz, onun daha iyi sağ veritabanında görüntüleri tutmak için. Eğer emin olmak için gereken tek şey resim var çok fazl yer almak wount olmasıdır. Sen gerekir:

1) JPEG olarak em Mağaza ve JPEG diğer resim türlerini manastır

2) daha büyük piksel boyutu vardır fotoğraflarını aşağı Resample sonra aslında gerekir.

Kullanıcılara görüntü göndererek yöntemlerinin özgürlüğü vermek + otomatik olarak bu şeyleri izleyebilirsiniz özel bileşen AccessImagine vardır. Buradan indirebilirsiniz - http://access.bukrek.net