Benim formunda bir PDF dosyası yüklemek için birini soran & am bir görüntü. Her ikisi de aynı dizi $ HTTP_POST_FILES ['rfiles'] dizisi gönderiliyor. Ben $ _FILES ['rfiles'] ['type'] doğrulamak istiyorum [0] "application / pdf" veya "metin / düz" özel ve $ _FILES ['rfiles'] ['type'] [1] ila bir "image / *" Bu ilk bölüm kodun çalışma parçasıdır. Ben onun verdiği ölçüde (Foreach / [$ key]) kullanmaya çalışıyorum. I = 'rfiles []' form adını kullanmadan 2 dosya göndermek için çalıştık, ama sonra $ _FILES bir coniption vardır. Bu yüzden Foreach yöntem zaten kullanılmalıdır görünüyor.
foreach ($_FILES['rfiles']['error'] as $key => $error) {
$tmp_name = $_FILES['rfiles']['tmp_name'][$key];
if (!$tmp_name) continue;
$name = basename($_FILES['rfiles']['name'][$key]); #the recycled variable
#This is where the other code would rest.
if ($error == UPLOAD_ERR_OK)
{
if (file_exists("/restdata/" . $_FILES["rfiles"]["name"][$key])) #Checking for a duplicate filename
{
echo $_FILES["rfiles"]["name"][$key] . " is currenty in use. Please rename your file to a unique name and try again.<br />\n";$badul[$key]=1; #badul[] is to be used later in the page in the followup form.
}
else
{
if ( move_uploaded_file($tmp_name, "/restdata/".$name) ) {
$uploaded_array[] .= "Uploaded file '".$name."'.<br/>\n";
echo "File is valid, and was successfully uploaded.\n<br />\n";
echo ($_FILES["rfiles"]["type"][$key]. " is a proper format.<br />\n"); #Mostly being used for testing purposes to get the correct MIME. But, how do I validate it?
echo ($uploaded_array[$key] . "<br>\n");
}
else
{
$errormsg .= "Could not move uploaded file '".$tmp_name."' to '".$name."'<br/>\n";
} # end if/else move_upoaded File
} #end if/else file_exists
} #end if $error == UPLOAD_ERR_OK
else $errormsg .= "Upload error. [".$error."] on file '".$name."'<br/>\n";
echo ( $errormsg );
} #End Foreach
Ben $ tuşunu kullanarak tutmak için abe olacak ama oldukça bir dizi bir dizi yapmak gibi olamaz çünkü ben 2 farklı yöntemler denedikten sağlam Foreach döngü tutmak için çalıştılar, 1 tek iyi olurdu. Hataları unpassable görünüyordu çünkü benim çalışma komut bu kaldırıldı
#absolutey predefine these variables before the Foreach statement.
$allowedExtensions[0] = array("txt", "rtf", "doc", "pdf");
$allowedExtensions[1] = array("gif", "jpg", "jpeg");
...
$file = $_FILES['rfiles'];
function isAllowedExtension($fileName) {
global $allowedExtensions[$key]; #tricky tricky?
return in_array(end(explode(".", $fileName)), $allowedExtensions[$key]);
}
if($error == UPLOAD_ERR_OK) {
if(isAllowedExtension($file['name'][$key]))
...
Argümanlar 1 geçerse, 2 dosyası ne olduğunu önemli değil çünkü diğer bir yöntem sadece çok delik bırakır:
...
if (((($_FILES["rfiles"]["type"][1] == "image/gif")
|| ($_FILES["rfiles"]["type"][1] == "image/jpeg")
|| ($_FILES["rfiles"]["type"][1] == "image/pjpeg"))
&& ($_FILES["rfiles"]["size"][1] < 5000000))
|| ((($_FILES["rfiles"]["type"][0] == "text/plain") #probaby the wrong syntax, but worth a shot.
|| ($_FILES["rfiles"]["type"][0] == "application/pdf")
|| ($_FILES["rfiles"]["type"][0] == "text/rtf"))
&& ($_FILES["rfiles"]["size"][0] < 15000000)))
{
if ($error == UPLOAD_ERR_OK)...
Ben $ HTTP_POST_FILES & aracılığıyla doğrudan saldırmaya teşebbüs ettik .. başka bir yolu var mı onu patlatmaya çalıştı?
EDIT: açıklama amaçları için - ayrı ayrı dosya doğrulamaları idare edebilmek gerekir. Değerleri ayrı ayrı veritabanına işleniyor. Belirli bir hata ile müşteri sağlamak mümkün değil onların ucunda çok karışıklık yaratacaktır.