简体   繁体   中英

How to base64 encode/decode jpg in php

After a week of Google and Stackoverflow suggestions, I have to ask. What am i doing wrong?

Overall goal is to encrypt data at rest with CodeIgniter 3 encrypt/decrypt but I have boiled the code to remove those step to try to get the basics to work.

Currently, I upload a jpg, save it to disk, read the file, base64_encode it and save it back. Then I read the file, base64_decode it, use imagecreatefromstring() and imagejpeg() to output it.

I have two results. Without adding the Content-Type header I see

?JFIFxx >CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), default quality C ?? ?? $.' ",#(7),01444'9=82<.342 C ? 2!!22222222222222222222222222222222222222222222222222 " ? ?}!1A?Qa"q2 #B R $3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? w!1AQaq?"2 B #3R br $4 %

--snipped-- I see no errors displayed that would be adding headers and I am not saving this out to a file that might contain spaces before the php tags.

When I add it I get:

This image "

Boiled down code

# open file to read it
$fhr = fopen($path_file, 'r+b');

# read entire file contents
$file_as_text = fread($fhr, filesize($path_file));
$type = pathinfo($path_file, PATHINFO_EXTENSION);

# encode
#$file_as_text = 'data:image/' . $type . ';base64,' . base64_encode($file_as_text);
$file_as_text = base64_encode($file_as_text);

# open for writing
$fhw = fopen($path_file, 'w+b');

# write the file
fwrite($fhw, $file_as_txt);

#On decode
$cipher_txt = fread($fh, filesize($path_file));

# decode
#$arr_data = explode(',', $cipher_txt);
#$plain_txt = base64_decode($arr_data[1]);
$plain_txt = base64_decode($cipher_txt);

# display
$image_resource = imagecreatefromstring($plain_txt);

if( $image_resource !== FALSE )
{
        header("Content-type: image/jpeg");
        header("Content-length: " . (string)(filesize($path_file)));
        imagejpeg($image_resource);
        # also tried
        # echo $plain_txt;
        # echo '<img src="' . imagejpeg($image_resource) . '" />';
        # before decode
        # echo '<img src="data:image/jpeg;base64,' . cipher_txt . '" />';
        # even tried the ob_start() -> ob_get_clean() suggestions without luck
}

All suggestions are appreciated.

Solution that worked for me was to remove the

$image_resource = imagecreatefromstring($plain_txt);

# and
header("Content-type: image/jpeg");
header("Content-length: " . (string)(filesize($path_file)));
imagejpeg($image_resource);

Then to send the base64_decoded string to an img tag as it's src value. That value had to include the data:image/jpeg;base64, portion in the string.

Thanks to all who looked.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM