PHP kullanarak bir tek dosya yükleme formu oluşturmak için en iyi yolu nedir?

4 Cevap php

Ben online birkaç örnek bulduk ama ben potansiyel bir güvenlik ve performans konuları ve bunların çözümleri gibi günlük PHP kullanmak insanlardan geribildirim almak istiyorum.

Bir defada tek bir dosya yükleyerek sadece ilgileniyorum unutmayın.

Bir eklenti kullanmanın yararlarını bilmek ilginç olurdu, ancak İdeal hiçbir tarayıcı eklentisi (Flash / Java) gerekli olacaktır.

Ben iyi HTML form kodunu ve PHP işleme kodunu bilmek istiyorum.

4 Cevap

File Upload Tutorial

HTML

<form enctype="multipart/form-data" action="action.php" method="POST">
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
  <input name="userfile" type="file" />
  <input type="submit" value="Go" />
</form>
  • action.php yükleme işleyecek bir PHP dosyası adıdır (aşağıda gösterilmiştir)
  • MAX_FILE_SIZE türü ile giriş hemen önce yer almalıdır file. Bu değer kolayca böylece güvenerek edilmemelidir istemci üzerinde manipüle edilebilir. Ana yararı bunu yükledim önce kendi dosya çok büyük olduğunu, erken uyarı ile kullanıcıya sunmaktır.
  • Sen türü file ile giriş adını değiştirmek, ancak herhangi bir boşluk içermediğinden emin olabilirsiniz. Ayrıca (aşağıda) PHP dosyasında karşılık gelen değerini güncelleştirmek.

PHP

<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Success.\n";
} else {
    echo "Failure.\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>

Yükleme-için klasörün aksi takdirde bir PHP komut dosyası yüklemek ve sunucuya üzerine onu çalıştırmak mümkün olacağını, HTTP üzerinden erişebileceği bir yerde yer olmamalıdır.

Değerini yazdırma $_FILES oluyor ne gibi bir ipucu verebilir. Örneğin:

    Array
    (
        [userfile] => Array
        (
            [name] => Filename.ext
            [type] => 
            [tmp_name] => 
            [error] => 2
            [size] => 0
        )
    )

Bu yapı dosyanın adı, MIME tipi, büyüklüğü ve hata kodu olarak bazı bilgiler verir.

Error Codes

0 Indicates that there was no errors and file has been uploaded successfully
1 Indicates that the file exceeds the maximum file size defined in php.ini. If you would like to change the maximum file size, you need to open your php.ini file, identify the line which reads: upload_max_filesize = 2M and change the value from 2M (2MB) to whatever you need
2 Indicates that the maximum file size defined manually, within an on page script has been exceeded
3 Indicates that file has only been uploaded partially
4 Indicates that the file hasn't been specified (empty file field)
5 Not defined yet
6 Indicates that there´s no temporary folder
7 Indicates that the file cannot be written to the disk

php.ini Configuration

Büyük dosyalar ile bu kurulumunu çalıştırırken hatalar alabilirsiniz. Bu tuşların için php.ini dosyasını kontrol edin:

max_execution_time = 30
upload_max_filesize = 2M

Uygun olarak bu değerleri artırmaya yardımcı olabilir. Apache kullanırken, bu dosyaya değişiklikleri yeniden başlatma gerektirir.

Yüklenip gibi dosya tmp dizinine yazılır gibi maksimum bellek izin verilen değer (via set memory_limit) burada bir rol oynamıyor. Tmp dizininin konumu isteğe upload_tmp_dir ile kontrol edilir.

Checking file mimetypes

Siz kullanıcı yükleme şeyin filetype kontrol etmelisiniz - en iyi uygulama izin filetypes listesine karşı doğrulamak için. Herhangi bir dosyayı sağlayan potansiyel bir risk olduğu a user could potentially upload PHP code to the server and then run it.

Mime türlerini doğrulamak için çok yararlı fileinfo extension (that supersedes the older mime_content_type işlevini) kullanabilirsiniz.

// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);

$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

More Information

Sen PHP.net manual de dosya yükleme işleme hakkında daha fazla bilgi edinebilirsiniz.

For PHP 5.3+

//For those who are using PHP 5.3, the code varies.
$fileinfo = new finfo(FILEINFO_MIME_TYPE);
$file = $fileinfo->file($_FILE['filename']['tmp_name']);
$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

More Information

Sen PHP.net documentation de FILEINFO_MIME_TYPE daha okuyabilirsiniz.

Bir okudum this introduction hangi size bilmeniz gereken her şeyi söylemelidir. Kullanıcı yorumları da oldukça yararlıdır.

Flash ana parası birden fazla dosya yüklemek için izin verir. Java ana parası dosya sisteminden sürükle ve bırak izin verir. Merkez soruya cevap için özür dilerim, ama ben oldukça basit gibi ben o atmak düşündüm.

Güvenlik ondan yürütülüyor komut güvenlik sadece fazladan bir katman eklemek için kullanışlı olabilir durur yüklenenler klasörüne bir. Htaccess ekleyerek yüklenenler dosya açısından oldukça büyük bir şeydir.

. Htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi

Referans: http://www.mysql-apache-php.com/fileupload-security.htm