PHP Resim Boyutlandırma &

2 Cevap php

Ben bir çok örnek gördük, ama ben şu anda sahip yükleme komut içine kravat nasıl emin değilim. H oranı: Birisi ben w tutarken sabit bir genişliğe yüklenen bir görüntüyü yeniden boyutlandırmak için ImageMagick veya benzeri bir şey kullanmak mümkün olabilir nasıl açıklayabilir misiniz?

Ben googled ve 150'den fazla web sayfalarına baktım ama bunların hiçbiri gerçekten benim durum için geçerlidir hissediyorum bir örnek vermek var. Herhangi bir yardım mutluluk duyacağız. İşte benim kod:

// Include Extension finder function.
include_once 'find_extension.php';

    // Function Gathers the Input Name, Store Number and Picture Number. The picture number is assigned by the loop that will be cycling through the images to be uploaded. The store Number and the Picure Number will make the file name.
    function uploadImage($inputname, $storenum, $picturenum){

// A few parameters, to restrict file types and file size to 20kb.
if ((($_FILES[$inputname]["type"] == "image/gif")
|| ($_FILES[$inputname]["type"] == "image/png") 
|| ($_FILES[$inputname]["type"] == "image/jpeg") 
|| ($_FILES[$inputname]["type"] == "image/pjpeg"))
&& ($_FILES[$inputname]["size"] < 200000))
  {
      // If there is an error, echo the error, if not continue.
    if ($_FILES[$inputname]["error"] > 0){
    	echo "Error: " . $_FILES[$inputname]["error"] . "<br />";
    }else{
      // Echo out File information.
 /* echo "Upload: " . $_FILES[$inputname]["name"] . "<br />";
  echo "Type: " . $_FILES[$inputname]["type"] . "<br />";
  echo "Size: " . ($_FILES[$inputname]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES[$inputname]["tmp_name"]; */
    }

    // Get the extension so we can rename using the previous function.
    $ext = findexts($_FILES[$inputname]["name"]);

    $newpicturename = $storenum . $picturenum . "." . $ext;
    // Check to see if the file exists, if it does then tell the user. If not continue.
    if (file_exists("userimages/" . $newpicturename)){

      echo "<br>" . $newpicturename . " already exists. ";

      }else{

    // Uploads the file.
      move_uploaded_file($_FILES[$inputname]["tmp_name"], "userimages/" . $newpicturename);

    $picturefield = "picture" . $picturenum;
    $picturepath = "userimages/" . $newpicturename;
    //Inserts data into ad DB
    mysql_query("UPDATE storead SET $picturefield='$picturepath' WHERE storenum='$storenum'");
    // Tells the User.
     // echo "Stored in: " . "userimages/" . $newpicturename;
      }

  }else{
      // If the upload does not meet the parameters above, then tell the user and cancel.
      echo "Error uploading " . $_FILES[$inputname]["name"] . ". File may be too large or of unnacepted format.";
  }

}

Thank you :)

2 Cevap

Yerine move_uploaded_file of (), size, görüntü işleme kütüphanesi içine dosyayı yüklemek yeniden boyutlandırmak ve bunu kaydetmek istiyorum.

örn. GD kullanarak) imagecreatetruecolor kullanılarak istenilen küçük boyut (yeni bir imaj oluşturmak, sonra imageCreateFromGif (), imagecreatefromjpeg () veya imagecreatefrompng () (var ne biçim bağlı) ile başlar ve imagecopyresampled kullanarak içine orijinal görüntüyü yeniden boyutlandırmak (.) Nihayet () / imagejpeg () / imagepng () ne istediğiniz biçimi bağlı imagegif kullanarak sonuçları kaydedin.

New_height = round_to_whole_pixels (new_width * original_height / original_width): Eğer sadece boy oranını korurken bir sabit genişlik istiyorsanız hedef boyutunu belirlemede oldukça kolaydır. Ancak bazı sağlık kontrolleri koyarak değer: Birisi 1x2000 piksel görüntü yükler söylüyorlar. (Diyelim ki) 200 piksel genişliğinde amaçlayan, daha sonra, 200x400000 için sunucunun bellek tüm yemek olabilir muazzam bir görüntü o kadar üfleme olurduk! Bu yüzden de bir max_height var.

Son olarak, bu haliyle script listelemek için çok ciddi güvenlik açıkları içermektedir. Eğer kamu internet üzerinde böyle bir şey koymadan önce, dizin geçişi saldırıları, SQL enjeksiyon, HTML enjeksiyon (XSS) ve dosya yükleme türü açıklarını koklama (bir resim dosyası kılığında HTML örn. gömme JavaScript) hakkında bilgi edinmek gerekir.

ETA:

Bu web sitesi en üsleri kapsar düşünüyor musunuz?

Pek değil, ama bu bir başlangıç. Bu öneri:

Eğer yükleme klasöründe herhangi yüklenen dosyaları yerleştirdiğinizde, bazı rasgele isimler için dosyayı yeniden adlandırın ve veritabanı dosya izleyebilirsiniz.

çok önemlidir. Siz kullanıcı tarafından gönderilen bir dosya asla güvenemem. Filenames düşündüğünüzden daha karmaşık ve bunlar kötü niyetli olmaya çalışıyorum olsanız bile, dosya adları yanlış gidebilir birçok tuhaf yolu vardır:

  • Bazı tarayıcılar, bazı bütün yolları dosya leafnames göndermek ve istemci makinede filepaths formatını bilmiyorum (çeşitli platformlarda dizin ayırıcıları, '/' include, '\', ':', ve muhtemelen diğerleri '.') .

  • ne verilen dosya adları izin verilmeyen karakterleri içermesi durumunda ne olacak? Kontrol karakterleri? Unicode karakterler?

  • Eğer bir Windows sunucu üzerinde iseniz, 'com' gibi bakıyor-zararsız ama ayrılmış adlara sahip dosyaları oluşturmak için deneyin ve bir ekin geleceğiz. Ayrıca, Windows sessizce kolayca komut karıştırmayın bir şekilde boşluk ve noktalar sondaki uzağa atar.

Ikincisi sen bağlantılı komut potansiyel bir güvenlik açığı olduğunu. Bu dosya adının sonunda '. Php' gibi 'kötü' dosya uzantıları için denetler. Eğer bir Windows sunucusu (boşluk) 'x.php' adlı bir dosya yükledi Ama eğer mutlu bunu kabul ve 'x.php' olarak kaydetmek istiyorsunuz. (O kullanır gibi komut bir hata da vardır. 'Bir normal ifadede, herhangi bir karakteri temsil edilmektedir. Dosya' poo.potatophp 'a. Php uzantısı sahip olarak alınacaktı Yani.)

Her zamanki gibi, beyaz liste ve kara listeye daha iyidir. Sadece örneğin izin veriliyor. '. Jpeg' uzantıları bilinen-kötü olanları reddetmek daha çalışmak daha muhtemeldir. Gönderilen JPEG dosyası aslında uzantısı '. Jpeg' olacaktır garantisi yoktur çünkü Ancak, bu, hala yetersizdir. Windows üzerinde bir uzantısı '. Jpg' veya '. Pjpeg' veya istemci makinede JPEG eşlenmesi olur tamamen başka bir şey olabilir. Mac veya Linux üzerinde o hiç dosya adı uzantısı olabilir!

Yani Özetle: Bu dosya yükleme alanları ile sunulan herhangi bir dosya adı / yolu görmezden en iyisidir. Belki de zaten bilmiyorsanız ne dosyayı biçimlendirmek olabilir tahmin etmek ona bir göz atabilirsiniz, ama bu itimat edemez ve hiç bunun için kullanıcının sözüne asla ve aslında altında kaydetmek isim.

Sayfası da bahsettiğim durumda 'bir görüntü dosyası kılığında HTML' kapsamaz. Eğer herkes tamamen sitenizde her şeyi tam erişim ile güvenmiyorum dosyalarını yüklemek için izin verirseniz, bu konuda endişelenmenize gerek. Bu konuda okuyabilirsiniz here. PHP dosya yükleme komut risklerin daha tartışma bakın here.

ETA2:

Ben web dizini yukarıdaki uploading öneriler bir çok gördük. Henüz benim komut dosyası hala web sitesi ziyaretçilerine bu dosyaları gösterecektir.

Evet, başlamak için iyi bir yerdir. Eğer beklenmedik şekillerde filetypes işleme web sunucusu ile herhangi bir sorunları önlemek kendi eline hizmet süreci kontrol altına alarak, kendi bilinen güvenli dosya adlarını kullanın ve komut "Content-jar" ekleyebilirsiniz alarak yapabilirsiniz başlık, Eğer çoğunlukla cross-site scripting sorunlara neden sitenizin güvenlik bağlamında kaynaklı olarak JavaScript gibi etkin içeriği tedavi tarayıcılar önlemek olabilir.

Bu yöntemin dezavantajı, PHP ile bir dosya sunan web sunucusu bunu izin daha, much daha yavaş olmasıdır. Size dosya hizmet komut HTTP cacheing başlığı şeyler bir yük uygulayarak konularda artırabilir, ama bu işin bir sürü ve hala hızlı C yazılmış tipik bir web sunucusu olarak ve belki çekirdek düzeyinde ağını kullanarak yere yakın olmayacak verimlilik kesmek. Bazen kadar hizmet bir dosya için, bu hiç sorun değil. Yoğun bir sitede her zaman izlenen popüler bir görüntü için, hiç iyi.

Ayrıca, Flash hala bu eklenti ile XSS için sinsi dosyaları neden olabilir ki, Content-Disposition başlığını görmezden bazı sorunlar olduğu için orada kullanılan. Bunlar şimdi sabit, ama kim diğer eklentileri ve tek tarayıcı davranışları orada ne olabileceğini bilir vardır. Yani güvenliği için, farklı bir hostname, örneğin sizin güvenilmeyen kullanıcı tarafından yüklenen dosyaları hizmet için iyi olabilir. data.example.com gibi bir subdomain. Bu iki güvenlik bağlamlarında sızıntı çerezleri ve kimlik doğrulama bilgilerini durur. Eğer dosyaları tükürme bir web sunucusu tabanlı yol giderseniz, kesinlikle bu önlem almak gerekir.

Ben sadece bu halletmek istiyorum, onun yol çok karmaşık

Evet, bu aldatıcı basit bir görev gibi görünüyor, ama gerçekten değil. Bazı çok yüksek profilli web siteleri güvenilmeyen yüklenenler nedeniyle güvenlik sorunları uğramış; Microsoft ve Google'ın web adamlar her zaman doğru alınamıyor ise, muhtemelen is oldukça karmaşık ...

Bu (PHP için her zamanki gibi) bu tür bir şey kapsayan orada öğreticiler% 99 mutlak bok olduğunu yardımcı olmuyor.

list($originalWidth, $originalHeight) = getimagesize($originalFile);
$width = 250; // whatever your fixed width is
$height = ceil(($width / $originalWidth) * $originalHeight);

Sonra bob talimatlarını takip