restore base64_encode image to a file system from database - php

I'm saving some of my image in to mysql database using base64_encode.
now I want to restore them back to file system.
How can I do that?
Edit...!
Ok, I did not explain enough.
I use this code to encode my image and save them in to a blob table:
function base64_encode_image ($imagefile) {
$imgtype = array('jpg', 'gif', 'png');
$filename = file_exists($imagefile) ? htmlentities($imagefile) : die('Image file name does not exist');
$filetype = pathinfo($filename, PATHINFO_EXTENSION);
if (in_array($filetype, $imgtype)){
$imgbinary = fread(fopen($filename, "r"), filesize($filename));
} else {
die ('Invalid image type, jpg, gif, and png is only allowed');
}
return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}
and use this code to show my image in browser:
if (!isset($_GET['id']) && !ctype_digit($_GET['id'])){
die('Error');
} else {
require_once( addslashes(dirname(dirname(__FILE__)) . '/config.php') );
require_once( addslashes(dirname(__FILE__) . '/Functions.php'));
$row = mysql_fetch_array(mysql_query ("SELECT `id`,`cover_small` FROM `om_manga` WHERE `Active` = '1' AND `id` = '".sql_quote($_GET['id'])."'"));
if (isset($row['id'])){
header("Content-type: image/jpeg");
readfile($row['cover_small']);
} else {
die('Error');
}
}
Now i want them back to a jpg file.
The size of all those image are less then 3kb.

Use PHP's base64_decode() function to convert the encoded data back to binary.
Since base64_decode returns a string, you can use file_put_contents() to write the decoded contents to a file.
It makes me wonder why you're storing the image base64 encoded if you're not using it in that format. You could just as easily store the image in binary format in a binary blob column.
Base64 encoding adds a 33% character overhead (not bytes).
Edit for revised question
The answer to your second question is subjective without context. Without knowing the details of your system, I can't recommend whether you should extract the images.

Decode it the same way you encoded it...
base64_decode()
You might want to store the file extension of the image when writing it to the database so that you can restore it accurately. Just concatenate the new name with the existing extension.
What you should so is something similar to this :
// Retrieved values from database
$encodedImg = $sqlResult['encoded_img'];
$ext = $sqlResult['encoded_img_ext'];
// Concatenate new file name with existing extention
// NOTE : This parameter is a full path. Make sure that the folder
// you are writing the file to has the correct permissions allowing the
// script write access.
$newImagePath = "/some/path/on/the/servers/filesystem/";
$newImageName = $newImagePath."decoded_image.".$ext;
// Saving the decoded file with the new file name.
file_put_contents($newImageName, base64_decode($encodedImg));

Related

Trying to resize uploaded files as they are saved to server

I am using Glide to deliver image content from one of my sites. This is working well and I have now built a file upload so that admins can upload images to the site for subsequent download.
Some of the images that admins will upload will be much larger than I need (or want the overhead of storing on the server), so I want to downsize them, preferably during the upload routine or failing that, just after they have been saved to their new location (storage/app/images)
So, I've been hacking around with intervention for instance without much success because of my poor understanding of the file names and paths available from getClientOriginalName/Extension etc.
Could anyone show me a pattern for this which would work well. Ideally I'd love to include something like I've seen on others' examples like...
$img = Image::make('foo.jpg')->resize(300, 200);
... in the correct place in my code
foreach($files as $file) {
$fileExtension = $file->getClientOriginalExtension();
$fileMimeType = $file->getMimeType();
if(in_array($fileExtension, $allowableExtensions)) {
if(in_array($fileMimeType, $allowableMimes)) {
array_push($dbFileList, $file->getClientOriginalName());
$newImage = '/images/' . $propertyCode . '/' . $file->getClientOriginalName();
Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));
}else{
$errorMessage = 'At least one file was not an image, check your results...';
}
}else{
$errorMessage = 'At least one file was not an image, check your results...';
}
}
Update 1:
Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));
$img = Image::make($file);
Storage::put('/images/new/' . $file->getClientOriginalName(), $img);
This updated code outputs the files to the /new directory and all looks fine, but the output files have 'zero bytes'. What am I missing?
Update 2: Final code
The final answer (after using the proper code provided by contributors) was that:
I had to move my app from virtual box on to the dev machine (iMac) to prevent extra confusion with paths
The path for the images must exist prior to making the ->save()
The path variable must be set in advance of the ->save()
I don't need the Storage::put at all, so the larger file never ends up on the server.
Then this final code started to work.
$path = storage_path('app/smallpics/')."/".$file->getClientOriginalName();
$img = Image::make($file)->resize(300,200)->save($path);
Much thanks to all of you. You make my Laravel learning curve a bit less terrifiying!!
You can use Intervention to manipulate your image (resize etc.) as
$new_image = Image::make($file)->resize(300,200)->save('/path/to/save');
The image upload and resize work flow is like:
Upload the image from tmp to your directory.
Make a copy of that image by setting the height, width, quality and save it in the same or some other directory.
Delete the original image.
So as per your code flow:
Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));
after this code, put the image compress code and after that delete the original image.
you can use Intervention or just use imagemagick convert command line command for resize or convert.
Pay attention to comments :
public function saveUploadPic(Request $request)
{
$pic = $request->file('<NAME_OF_FILE_INPUT_IN_HTML_FORM>');
#check for upload correctly
if(!$pic->isValid())
{
throw new Exception("IMAGE NOT UPLOADED CORRECTLY");
}
#check for mime type and extention
$ext = $pic->getClientOriginalExtension();
$mime = $pic->getMimeType();
if(!in_array($mime, $allowedMimeTypeArray) || !in_array($ext, $allowedExtArray))
{
throw new Exception("This Image Not Support");
}
#check for size
$size = $pic->getClientSize() / 1024 / 1024;
if($size > $allowedSize)
{
throw new Exception("Size Of Image Is More Than Support Size");
}
########################YOU HAVE TWO OPTION HERE###################
#1- save image in a temporary location with random hash for name if u need orginal image for other process
#below code save image in <LARAVEL_APP_PATH>/storage/app/tmp/pics/
$hash = md5(date("YmdHis").rand(1,10000));
$pic->storeAs('tmp/pics', $hash.'.'.$ext);
#Then resize or convert it
$img = Image::make(storage_path('app/tmp/pics/'.$hash.'.'.$ext))->resize(300, 200);
#save new image whatever u want
$img->save('<PATH_TO_SAVE_IMAGE>');
#after u finish with orginal image delete it
Storage::delete(storage_path('app/tmp/pics/'.$hash.'.'.$ext);
#2- Or just use below for resize and save image witout need to save in temporary location
$img = Image::make($pic->getRealPath())->resize(300,200);
$img->save('<PATH_TO_SAVE_IMAGE>');
}
if you want to use convert see this link.

How to get file information before saving it

I have file contents which I am receiving from my form in string form (base64), and now before using file_put_contents() function to save the file, I wanna know the information related to it, like it's size and mimetypes and so on.
So the question is how to retrieve a file's information just by it's data(base 64 string)
For ex, let's say I have this string:-
Object {files: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvwA…Fb+kScAm4BFwC6yGB/w9uNEwUj3EmdQAAAABJRU5ErkJggg==", text: "hi"}files: "data:image/png;base64,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…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"text: "hi"__proto__: Object
54:783
$encoded_data = 'iVBORw0KGgoAAAANSUhEUgAAAvwA…Fb+kScAm4BFwC6yGB/w9uNEwUj3EmdQAAAABJRU ....';
$size = strlen(base64_decode($encoded_data));
remember base64 encoding increases the original data in size by about 33%
Now we can write a function -
function getFileSize($base64string){
$bytes = strlen(base64_decode($base64string));
$roughsize = (((int)$bytes) / 1024.0)* 0.67;
return round($roughsize,2);
}
this function will return filesize in Kb.
Now to know the Mime Type you can use Fileinfo
$imgdata = base64_decode($encoded_data);
$f = finfo_open();
$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);

Retrieving external image and saving locally results in distorted image

Stuck on this one. I have this function below that simply takes $ImageSrc which is an external image from anywhere, eg imgur, and then saves it locally (this is not a scraper, I'm allowing people to attach images to their profiles)
public function UploadScreenshot($ImageSrc, $Title, $Description = false) {
$RandomName = substr(md5($Title . time()), 0, 20);
$UploadDir = "/home/vanrust/public_html/Screenshots/";
$file = pathinfo($ImageSrc);
$ext = $file["extension"];
if (!in_array($ext, array('jpg','png','bmp','jpeg'))) return array("error" => "Invalid File Type");
$RandomName = "{$RandomName}.{$ext}";
$image = file_get_contents($ImageSrc);
file_put_contents($UploadDir . $RandomName, $image);
}
The result of the file no matter what is unrecognizable.
The image:
After UploadScreenshot() has retrieved it:
Try to use rename() to move the original file to the new location and rename it.
$file = pathinfo($ImageSrc);
$ext = $file["extension"];
if (!in_array($ext, array('jpg','png','bmp','jpeg'))) return array("error" => "Invalid File Type");
$RandomName = "{$RandomName}.{$ext}";
rename($UploadDir . $RandomName, $ImageSrc);
}
Alternatively, you can use move_uploaded_file() if your $ImageSrc does contain a valid upload file (meaning that it was uploaded via PHP's HTTP POST upload mechanism).
file_put_contents() needs to be used with caution. A single offset (in binary codes) at the beginning or at the end of the file will significantly alter the picture. It requires a validation at the end to compare both files bytes.

php return image from url

I want to return an image over an URL like http://placehold.it/500x500.
I have my URL http://example.inc/assets/image/35345, which calls an action on controller. The controller get some data (name, id, etc.) from database and also a binary string of the image content.
On the frontend site, i have my img tag, where i want to call the url in my src attribute.
<img src="http://example.inc/assets/image/35345">
Some more information, i use slim PHP Framework and my server is an ubuntu 13.x system (vagrant etc.). I am an typically frontend developer and dont have good skills # PHP.
Following snippets works:
$file = fopen($name, 'wb');
fwrite($file, $binaryData);
fclose($file);
but I dont want to generate files in a directory. Is this possible?
EDIT: Content-Type and Content-Length Headers are set, that is not the problem.
Grab the contents of the image, base_64 encode it, then return a a base64 image.
$file = file_get_contents($name);
list($width, $height, $type, $attr) = getimagesize($file);
echo '<img src="data:image/'.$type.';'.base64_encode($file).'"/>';
You should upload images in directory by using something like this. This code will upload your image in directory.
if ($_FILES['file']['name'] != "") {
$filename = $_FILES['file']['name']; //getting name of the file from form
$filesize = $_FILES['file']['size'];
$info = new SplFileInfo($filename);
$ext = $info->getExtension();
$filesize1 = ($filesize * .0009765625) * .0009765625;
if (!($ext == 'jpg' || $ext == 'png' || $ext == 'jpeg')) {
//set some error message and redirect
}
if ($filesize1 >= 5.0) {
//set message image size should be less than 5 mb
}
$target_path = $_SERVER['DOCUMENT_ROOT'] . "../images/profile_images/";
move_uploaded_file($_FILES['file']['tmp_name'], "$target_path" . $_FILES['file']['name']) or
die("Could not copy file!");
}
Insert image name(with extension) in database.($filename here)
Fetch image name from database and store in variable($profile_image here),use it in img src.
<a href='../images/profile_images/$profile_image'><img alt='Avatar' src='../images/profile_images/$profile_image'></a>
You can use only Anchor tag to redirect user on image in another tab in browser.
hope this answer will help you.
Because i had an mssql database with iso charset i have converted all of my results to utf-8, the problem was, that the bytestring also converted to utf-8.
after non converting the bytestring i also returned the bytestring and set the header content type to image/extension

Are still this code vulnerable to (Invalid File Uploading Attack) such as image that contains PHP code?

Providing user to upload images has wide usage, however, checking file extension and MIME type not guarantee correct file type.
Alternative:
I used imagejpeg() and imagecreatefromjpeg() functions for creating the image from $_FILE['userfile']['tmp_name'] and then saving it in images/ dir. In this case, I ignored move_uploaded_file() function.
Are still this code vulnerable to fake image uploading attack?
$filename = $_FILE['inputfile']['name'];
$upload_path = 'images/';
//extract extension
$ext = strtolower(substr($filename, strrpos($filename, '.') + 1));
// return mime type ala mimetype extension
$finfo = finfo_open(FILEINFO_MIME_TYPE);
//get MIME type of the given file
$mime = finfo_file($finfo, $filename);
//close finfo
finfo_close($finfo);
if (is_uploaded_file($_FILES['inputfile']['tmp_name'])) {
//first check: file extension and mime type
if(!in_array($ext, array('jpeg', 'jpg', 'gif', 'png')) && !in_array($mime, array('image/jpeg', 'image/gif', 'image/png')) ){
die("Error1: Invalid Image type");
}
if($ext == 'jpeg' || $ext == 'jpg'){
$im = #imagecreatefromjpeg($_FILE['inputfile']['tmp_name']);
if($im){
$createimage = imagejpeg($im, $upload_path.$_FILE['inputfile']['name']);
if(!$createimage){
die("Error3: Can't create image!");
}
//last check
$filecontent = file_get_contents($upload_path.$_FILE['inputfile']['name']);
//clean the file from any php code
$filecontent = str_replace(array("<?php", "<?", "?>"), "", $filecontent);
$handle = fopen($upload_path.$_FILE['inputfile']['name'], "wb");
fwrite($handle, $filecontent);
fclose($handle);
}
else{
die("Error2: Invalid Image Detected");
}
}
}
One can always embed PHP code safely in a perfectly valid image file. There are too many ways to do that to worth even thinking avoiding them. Many valid image formats, many data containers such as EXIF in jpg for example, pixel level and compression manipulation, etc.
To be on the safe side one should protect the server from arbitrary file inclusion attacks and sanitize the file extensions to escape from apache configuration mistakes.
A more crazy approach is to create a slightly modified copy of the image, more exactly create a new image from the original one modified, a slight resize or color manipulation will delete the bitmap level PHP injections while copying will save you from most of the PHP injected in other data containers within the image.

Categories