I'm currently experiencing a weird problem while I converted a web application to ODBC using PostgreSQL (coming from MySQL with PHP mysqli-connector).
I noticed that images that are stored as a bytea in PostgreSQL database and thrown into PHP's base64 function are not shown correctly. At some point it's cut off after a couple of lines. This cut off is with all bytea image data that is stored in our database, we have that for logos and signatures.
If you inspect the img tag with the browser's inspector you'll see (at least in Chrome) that there is a lot data of that image missing.
What I do is a SELECT * FROM table and then in a for-loop encode the image as base64:
$clients[$i]['logo'] = base64_encode($clients[$i]['image']);
$clients[$i]['image'] = this is the bytea in the database and
$clients[$i]['logo'] = this is the base64 String that I display in a Smarty template like this: data:image/png;base64,{$client.logo}
I hope you can help.
The solution is the length of data in the odbc.ini files. If the length is limited, base64 strings that are too long will be cut off. Just needed to increase the size.
Related
I'm using an API to get manufacturer logos and it's returning the logo as a binary DATASET. I need to convert this into an image using PHP, but I am having a hard time with it. I can input the DATASET into some easily found tools online and it will spit out the image, I just can't get PHP to do it for me. The API says:
Returns DATASET containing the binary representation of the Logo
The binary data from the API is as follows
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
What I've tried
I've tried using the imagepng and imagejpg functions after decoding it using base64_decode, but I'm just getting a tiny little white box.
Any help would be greatly appreciated.
This sucker looks like it's a gif.
You can deliver it to your browser like this, without converting it to anything.
<img src="data:image/gif;base64,/9j/4ye-yadda-yadda-yadda-KKKACiiigD/2Q==">
You can save it to a colt.gif or other file by base 64 decoding it and then writing that decoded data stream directly to the file. Don't use the php image* functions unless you want to convert it from gif to something else.
I have a page that is generating image data urls from a snapshot tool and inserting the resulting string into a MySQL database via PHP. Later on I have a page that takes and uses those images. This would be fine except I need to save the resulting html to my server for some post processing and the length of the image data urls is giving me a headache and making the html files upwards of 8 to 10 MBs which slows down the entire process. The image looks something like this:
<img src="data:image/png:base64,iVBORw0K43+gAA4u...">
Where there is an extremely long string of characters making the resulting html very large. Is there a way to host this on my server as a png so the link is a normal looking image? Something like this:
<img src="http://www.mysite.com/image1.png">
What about converting base64 to an original image, what you would be doing is saving the image as a actual file to the server.
Php to convert base64 data to image
function toImage($base_code){
$img_file = imagecreatefromstring(base64_decode($base_code));
imagejpeg($img_file, 'new.jpg');
}
Calling the function
echo toImage($encoded_image);
Make sure to only pass the base64 encoded string without the image tag
You can save the files elsewhere, but my guess is that you've got a requirement the images exist in the DB. If you save the files elsewhere, you've just doubled your disk requirements.
In any case, the general fix for this would be to save that image string to disk, and in your DB keep track of the path. Then when you generate the HTML, you'd use the path in the DB, rather than the binary data in the DB.
So I have a webcam widget to take snapshots from guests. My guest table have an image field and I want to store this pic on it. I tried storing raw binary data, base64 encoded data and it didn't works. I don't know if database is receiving correct data or if I don't dealing with returned data well. I'm using PDO in my app and I've read on the web that it can have an issue with data larger than 64 kb, anyone knows if it's true?
This is how I got the image data from the webcam:
$imagem = file_get_contents('php://input');
Like I said above I tried to store image's pure data $imagem and then this way:
$data = #unpack("H*hex", $imagem);
$imagem_bd='0x'.$data['hex'];
And for both of that I've tried encoding with base64 too, but none worked.
Just for information: This app I'm working is a remake of another similar app that have this feature too, but on this old app I's used TSQL and it works fine.
Thanks in adv.
EDIT
For now I have done the insert well, but I can't retrieve and render the image at the browser.
you can encode images in blob instead of base64. But i recommend you to store image as file and store the link to the image in database. As storing images in database may consume large space and also returning it can eat your server and also it may take more time to load compared to file system.
If you use PreparedStatement, all you need to do is use bindValue, with your binary image:
$sql = "INSERT INTO your_table (image) VALUES (?)";
$stmt->bindValue(1, $imagem);
$stmt->execute();
Anyway, as said here, it's not a good idea to store images in the database.
About the 64KB limit, it depends of the data types of your columns in the table (in MySQL, the BLOB type has a limit of 64KB, but there is another types of data, like MEDIUMBLOB and LONGBLOB).
I have a script that gets the raw binary image data via url request. It then takes the data and puts it into mysql.
Pretty simple right? Well It's I'm inserting some 8,000 decent sized 600x400 jpegs and for some odd reason some of the images are getting cut off. Maybe the part of my script that iterates through each image it needs to get is going to fast?
When I do a straight request to the URL I can see all the raw image data, but on my end, the data is cut off some way down the line.
Any ides why?
Is something in the chain treating the binary data as a string, in particular a C style null-terminated string? That could cause it to get cut off at the first null byte ('\0').
Have you tried simply call your script that pulls the binary image, and dump it out. If you see the image correctly then its not pulling part, might be something to do with inserting.
Are you setting the headers correctly?
ie:
header('Content-Length: '.strlen($imagedata));
header('Content-Type: image/png');
...
A string datatype would definitely not be the optimum for storing images in a DB.
In fact I've seen several recommendations that the image should go in a folder somewhere in your filesystem and the DB contains only the address/file path.
This is a link to a page about inserting images.
It contains the suggestion about the filepath and that a blob datatype is better if the images must go in the database.
If it's a blob, then treating it as a string won't work.
If you make repeated requests to the same url, does the image eventually load?
If so that points to a networking issue. Large packet support is enabled in your kernal (assuming linux) which doesn't work correctly for a lot of windows clients. I've seen a similar issue with large(1+MB) javascript libraries served from a linux machine.
http://en.wikipedia.org/wiki/TCP_window_scale_option
http://support.microsoft.com/kb/314053
I'm making a little forum for my clans website. I'm wondering if I should store the thread text in TEXT or BLOB? Whats the difference? I've seen that phpBB does that.
What is BLOB anyway? cant find much about it on Google.
A blob is just a bunch of bytes. An arbitrary number of bytes, nothing more.
If you were to store text as a blob, you'd have to worry about encoding (the process of translating text to bytes). But if you store things as text whatever database transport your using will make sure that the text stored in the database is properly encoded and decoded for both efficient storage and easy use.
If you're planning to store text, you should store text.
phpBB could implement text encoding and decoding themselves and that could be one reason to use blob instead of text. It's unlikely but sometimes text data types have a maximum length, the blob might be a work around for phpBB in this particular instance.
Re the "what" - BLOB is Binary Large OBject; compare to CLOB: Character Large OBject. Different databases call them different things, though - for example, on SQL Server you have image/varbinary(max) for BLOB, and text/varchar(max) for CLOB.
If a system only supports a BLOB, then one option is to encode strings - for example using UTF8. This might be what is happening.
BLOB is for binary data. I don't know the reason why phpBB 3 stores everything in binary but I have noticed it myself. My guess is that they are compressing/encoding whatever they put into the database. You could try looking through the phpBB source code to see if there is any comments explaining it.