bulletproof icon indicating copy to clipboard operation
bulletproof copied to clipboard

Simple and secure image uploader in PHP

BULLETPROOF

Latest Stable Version Total Downloads Scrutinizer Code Quality Gitter chat License

Bulletproof is a single-class library to upload images in PHP with security.

Install

Using git

$ git clone https://github.com/samayo/bulletproof.git

Or composer

$ composer require samayo/bulletproof:4.0.*

Or download it manually based on the archived version of release-cycles.

Usage

Create an HTML form like this.

<form method="POST" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
  <input type="file" name="pictures" accept="image/*"/>
  <input type="submit" value="upload"/>
</form>

And copy & paste the following code to upload the image

require_once  "path/to/bulletproof.php";

$image = new Bulletproof\Image($_FILES);

if($image["pictures"]){
  $upload = $image->upload(); 

  if($upload){
    echo $upload->getFullPath(); // uploads/cat.gif
  }else{
    echo $image->getError(); 
  }
}

For more flexibility, check the options and examples below.

Configs

Setting Properties

Before uploading, you can use these methods to restrict the image size, dimensions, mime types, location...

// Pass a custom name, or it will be auto-generated
$image->setName($name);

// define the min/max image upload size (size in bytes) 
$image->setSize($min, $max);

// define allowed mime types to upload
$image->setMime(array('jpeg', 'gif'));

// set the max width/height limit of images to upload (limit in pixels)
$image->setDimension($width, $height);

// pass name (and optional chmod) to create folder for storage
$image->setLocation($folderName, $optionalPermission);

Getting Properties

Methods for getting image info before/after upload.

// get the provided or auto-generated image name
$image->getName();

// get the image size (in bytes)
$image->getSize();

// get the image mime (extension)
$image->getMime();

// get the image width in pixels
$image->getWidth();

// get the image height in pixels
$image->getHeight();

// get image location (folder where images are uploaded)
$image->getLocation();

// get the full image path. ex 'images/logo.jpg'
$image->getFullPath();

// get the json format value of all the above information
$image->getJson();

Customized example

This will set image constrains and return output after upload

$image = new Bulletproof\Image($_FILES);

$image->setName("samayo")
      ->setMime(["gif"])
      ->setLocation(__DIR__ . "/avatars");

if($image["pictures"]){
  if($image->upload()){
    echo $image->getName(); // samayo
    echo $image->getMime(); // gif
    echo $image->getLocation(); // avatars
    echo $image->getFullPath(); // avatars/samayo.gif
  }
}

Image Manipulation

To crop, resize or watermak images, use functions stored in src/utils

Creating custom errors

Use php exceptions to define custom error responses

if($image['pictures']){
  try {
    if($image->getMime() !== 'png'){
      throw new \Exception('Only PNG image types are allowed');
    }

    // check size, width, height...

    if(!$image->upload()){
      throw new \Exception($image->getError());
    } else {
      echo $image->getFullPath();
    }
    
  } catch (\Exception $e){
    echo "Error " . $e->getMessage();
  }
}

What makes this secure?

  • Uses exif_imagetype() to get the true image mime (.extension)
  • Uses getimagesize() to check if image has a valid height / width in pixels.
  • Sanitized images names, strict folder permissions and more...

License: MIT