كيف يمكنني فقط السماح لبعض الأنواع بالتحميل في PHP؟

StackOverflow https://stackoverflow.com/questions/2486329

  •  21-09-2019
  •  | 
  •  

سؤال

أقوم بعمل صفحة حيث يقوم المستخدم بتحميل ملف. أريد عبارة IF لإنشاء متغير خطأ $ إذا كان نوع الملف هو أي شيء آخر JPG و GIF و PDF.

هذا هو الكود الخاص بي:

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

if(/*$file_type is anything other than jpg, gif, or pdf*/) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}

أواجه صعوبة في هيكلة البيان if. كيف أقول ذلك؟

هل كانت مفيدة؟

المحلول

ضع الأنواع المسموح بها في صفيف واستخدام in_array().

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

$allowed = array("image/jpeg", "image/gif", "application/pdf");
if(!in_array($file_type, $allowed)) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}

نصائح أخرى

تعديل

لقد أدركت للتو أنك تريد السماح ملفات PDF أيضًا. في هذه الحالة تحقق من فئة FileInfo PHP ووظائفها. ولكن بقدر ما يذهب الأمن ، لا يزال يتعين عليك الاعتماد عليها $_FILES[]['type'] :)

سأترك الباقي هنا في حال يساعد شخص آخر يجد هذا السؤال


للتحقق من نوع MIME للصورة ، $_FILES[]['type'] يمكن أن يكون غير آمن. يتم إرسال هذه البيانات من قبل المتصفح ويمكن أن يكون خداع بسهولة.

يجب عليك استخدام getimagesize() الوظيفة إذا كنت تريد فقط السماح بتحميل الصور (على الرغم من اسمها المضللة). لن تمنحك هذه الوظيفة الحجم فحسب ، بل كل البيانات التي قد تحتاجها على الأرجح حول الصورة.

لقد استخدمت البرنامج النصي التالي في فئة معالجة الصور:

private function load_image_data($image_file) {

    // Firstly, to disambiguate a loading error with a nonexistant file error,
    // check to see if the file actually exists.
    if( ! file_exists($image_file) ) {
        throw new Nonexistent_Image_Exception("The file '{$image_file}' does not exist");
    }

    // We're going to check the return value of getimagesize, so we don't
    // need any pesky warnings or notices popping up, since we're going to
    // stop execution of this function if something goes wrong.
    $image_data = @getimagesize($image_file);

    if( $image_data === false ) {
        throw new Load_Image_Exception("Could not get image data from '{$image_file}'");
    }

    $this->size = new Dimensions($image_data[0], $image_data[1]);
    $this->mime = $image_data['mime'];

}

لاحظ أن getimagesize() إرجاع مجموعة نقاطية تحتوي على مؤشر "MIME". البيانات هنا موثوقة.

في وظيفة أخرى ، راجعت نوع MIME من الصورة وحولتها إلى PNG مع وظيفة GD المناسبة:

private function load_image($image_file) {

    // Suppress warning messages because we're going to throw an
    // exception if it didn't work instead.
    switch( $this->mime ) {
    case 'image/jpeg':
    case 'image/pjpeg':
        $this->image = @imagecreatefromjpeg($image_file);
        break;
    case 'image/gif':
        $this->image = @imagecreatefromgif($image_file);
        break;
    case 'image/png':
        $this->image = @imagecreatefrompng($image_file);
        break;
    default:
        throw new Invalid_Image_Exception("The image was of an invalid type");
    }

    if( $this->image === false ) {
        throw new Load_Image_Exception("Loading of image '{$image_file}' failed");
    }

}

ربما لن تحتاج إلى القيام بكل هذا ، ولكن يمكنك أن ترى أنواع MIME التي تظهر بالنسبة إلى الأنواع التي حددتها. لاحظ أن JPEG يمكن أن يكون له نوعان مختلفان.

أتمنى أن يساعدك هذا.

أنظر أيضا Zend Frameworkzend_file_transfer_adapter_http وzend_form_element_file. يمكنك إضافة العديد من المدققات المختلفة مثل الحد الأدنى لدقة الصورة ، ونوع MIME ، والحد الأدنى لحجم الملف ، وملحقات الملف المسموح بها ، إلخ.

استخدم هذا الرمز البسيط ...

<?
$path = $_FILES['file']['name']; // file means your input type file name
$ext = pathinfo($path, PATHINFO_EXTENSION);

if ($ext=="jpg" OR $ext=="jpeg" OR $ext=="gif" OR $ext=="png") {
    // your code here like...
    echo "Upload successful";
}else{
    // your invalid code here like...
    echo "Invalid image format. Only upload JPG or JPEG or GIF or PNG";
}
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top