Расшифруйте base64 в jpeg и сохраните изображение на сервере - PullRequest
0 голосов
/ 15 октября 2019

в настоящее время у меня есть значение base 64 в

$model->test

, и я хочу декодировать значение base 64 в контроллере и сохранить его в базе данных через API, здесь мой код в контроллере

я пытаюсь декодировать и не могу понять, как загрузить его на сервер и создать путь, однако я пытаюсь передать $ data в getinstance, который не работает

public function doSaveStudent(StudentLoanForm $model)
{
    $url = API_URL . 'web/apply/student';
    $data1 = $model->test;
    $decode = base64_decode($data);
    $img = file_put_contents('webcam.jpg', $data);

    $model->doUploads();

    $ktpdetail = UploadedFile::getInstance($model, 'image_ktp');

    $data = null;

    $data = [

        [
            'name' => 'univ_name',
            'contents' => $model->univ_name
        ],
            [
            'name' => 'test',
            'contents' =>$model->test
        ],

    ];
    // dd($model->test);
    if ($ktpdetail != null) {
        $data[] = [
            'name' => 'image_ktp',
            'contents' => fopen(Yii::getAlias('@frontend/web/') . $model->image_ktp, 'r'),
            'filename' => $ktpdetail->getBaseName() . '.' . $ktpdetail->getExtension()
        ];
    }

    if($ktpayahdetail != null){
        $data[] = [
            'name' => 'foto_ktp_ayah',
            'contents' => fopen(Yii::getAlias('@frontend/web/') . $model->foto_ktp_ayah, 'r'),
            'filename' => $ktpayahdetail->getBaseName() . '.' . $ktpayahdetail->getExtension()
        ];
    }
    if ($kkdetail != null) {
        $data[] = [
            'name' => 'image_kk',
            'contents' => fopen(Yii::getAlias('@frontend/web/') . $model->image_kk, 'r'),
            'filename' => $kkdetail->getBaseName() . '.' . $kkdetail->getExtension()
        ];

я ожидаю декодировать базу 64 и загрузитьвсе значение, используя лучшие практики yii2

1 Ответ

0 голосов
/ 15 октября 2019

yii\web\UploadedFile используется только для файлов, загруженных с помощью ввода файлов в формах.

В вашем случае base64_decode($model->test) должен дать вам двоичные данные изображения.

Тогда у вас есть два варианта, что с ними делать.

1) Вы можете сохранить их напрямуюв атрибут BLOB в базе данных.

$imageModel = new MyImageModel();
$imageModel->data = base64_decode($model->test);
if(!$imageModel->save()) {
    throw new \yii\base\Exception("Couldn't save file to db");
}

2) Вы можете сохранить файл с помощью file_put_contents, а затем сохранить путь к файлу в вашей модели.

$imageData = base64_decode($model->test);
//the used alias in path is only example. 
//The datetime and random string are used to avoid conflicts
$filename = Yii::getAlias(
    '@frontend/web/' . date('Y-m-d-H-i-s') .
        Yii::$app->security->generateRandomString(5) . '.jpg'
);
if (file_put_contents($filename, $imageDate === false) {
    throw new \yii\base\Exception("Couldn't save image to $filename");
}
$imageModel = new MyImageModel();
$imageModel->path = $filename;
if(!$imageModel->save()) {
    //delete file if we couldn't save path into db to prevent creating an orphan
    unlink($filename);
    throw new \yii\base\Exception("Couldn't add $filename to database");
}
...