Строка Base64_decoded изображения, сохраненная в каталоге, не показывает изображение - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь загрузить изображение из моего приложения для Android в скрипт php на моем сервере.В моем сценарии я пытаюсь декодировать изображение (используя base64_decode), а затем использовать file_put_contents (), чтобы сохранить изображение в виде файла в моем каталоге.Моя проблема в том, что файл «кажется» пустым, когда у меня есть .jpg в конце имени файла.Когда я удалил это, чтобы увидеть, что было добавлено для кодировки изображения, я увидел очень длинную строку символов (65214 байт, которые были записаны в файл).Когда я снова запускаю код, только на этот раз, загружая $ _POST ['sent_image'] без декодирования, я получаю точно такую ​​же строку текста.

Я не уверен, что делаю неправильно ...Конечная цель - сохранить изображение на сервере, чтобы его можно было просматривать в Интернете, а также получить его и вернуться к другой активности в моем приложении для Android.

Все предложения приветствуются!

ПРИМЕЧАНИЕ. Я также пробовал imagecreatefromstring (), но при этом записывается 0 байт.

Мой код: PHP, который получает закодированное изображение Android и пытается сохранить в каталог сервера:

<?php

include('inc.php');

if ((isset($_POST['searchinput'])) && (isset($_POST['newUnitStatus'])) && (isset($_POST['generalCause'])) && (isset($_POST['newUnitStatusComment'])) && (isset($_POST['newUnitStatusPhoto'])) && (isset($_POST['lexauser'])) && (isset($_POST['password']))) {

    $sgref = "";
    $searchinput = $_POST['searchinput'];
    $newUnitStatus = $_POST['newUnitStatus'];
    $generalCause = $_POST['generalCause'];
    $newUnitStatusComment = $_POST['newUnitStatusComment'];
    $lexauser = $_POST['lexauser'];
    $pass = $_POST['password'];

    if ((strpos($searchinput, "/") !== false)) {

        $barcodesplit = preg_split('/\D/im', $searchinput, 4);
        $sgref = $barcodesplit[0];
        $lineitem = $barcodesplit[1];
        $unitnumber = $barcodesplit[2];
        $totalunits = $barcodesplit[3];
        $unitname = $sgref."-".$lineitem."-".$unitnumber."_of_".$totalunits;

        $photo = $_POST['newUnitStatusPhoto'];
        $decodedPhoto = str_replace('data:image/jpg;base64,', '', $photo);
        $decodedPhoto = str_replace(' ', '+', $decodedPhoto);
        $newUnitStatusPhoto = base64_decode($decodedPhoto);
        //$newUnitStatusPhoto = imagecreatefromstring($decodedPhoto);

        $fileName = "".$unitname."_rej";
        $target = '../LEXA/modules/bms/uploads/';
        $newFile = $target.$fileName;
        $docType = "Reject";

        $success = file_put_contents($newFile, $newUnitStatusPhoto);

        if($success === false) {
            $response['message'] = "Couldn not write file.";
            echo json_encode($response);
        } else {
            $response['message'] = "Wrote $success bytes. ";
            echo json_encode($response);
        }

    } else {
        $sgref = $searchinput;
        $response['message'] = "I'm sorry, but you must enter a unit's uniqueid value to add a unit exception. Please view the siblings for this SG and pick the unit you need. Then you can add the new status.";
        echo json_encode($response);
    }

} else {

    $response['message'] = "Your search value did not get sent. Please try     again.";
    echo json_encode($response);
}//End logic for post values.
?>

Спасибо!

1 Ответ

0 голосов
/ 05 июня 2018

Использование str_replace может быть проблематичным, если, например, формат изображения отличается от jpg.

Пример кода:

<?php
$photo = $_POST['newUnitStatusPhoto'];



if(substr($photo, 0,5) !== "data:"){
    //do error treatment as it's not datauri
    die("Error: no data: scheme");
};
$decodedPhoto = substr($photo, 5);
$mimeTerminator = stripos($decodedPhoto,";");
if($mimeTerminator === false){
    die("Error: no mimetype found");
};
$decodedPhoto = substr($decodedPhoto, $mimeTerminator+8); //1<;>+4<base>+2<64>+1<,>

// $decodedPhoto = str_replace('data:image/jpg;base64,', '', $photo);
// $decodedPhoto = str_replace(' ', '+', $decodedPhoto);
$newUnitStatusPhoto = base64_decode($decodedPhoto);
//$newUnitStatusPhoto = imagecreatefromstring($decodedPhoto);
$unitname = "testando";
$fileName = "".$unitname."_rej.jpg";
$target = 'img/';
$newFile = $target.$fileName;
if(file_exists($newFile))
    unlink($newFile);

$success = file_put_contents($newFile, $newUnitStatusPhoto);
echo $success;
...