PHP将base64图像字符串转换为MySQL的blob

时间:2016-05-30 21:48:52

标签: php stored-procedures mysqli base64 blob

我在PHP中有一个图像的base64字符串,例如:

$imgStr =  'data:image/png;base64,E0LdjA==';

我有一个包含2个字段id(varchar)img(blob)的MySQL表。我有一个插入这些值的存储过程,并且来自PHP。

我使用base64_decode($imgStr)将图像转换为blob,程序执行但数据库中blob的值为空。

这是我执行的PHP函数:

function test($id,$img){
        if (connect()){
            global $conn;
            $query = $conn->prepare("CALL prctest(?,?,@rtn)");
            $blob = base64_decode($img); 
            $query->bind_param('sb',$id,$blob); 
            $query->execute();
            $result = $conn->query("SELECT @rtn as rtn");
            $row = $result->fetch_assoc();
            echo  $row['rtn'];
            $result->free();
            close();
        }
        else{
            echo "connection error!";
        }
    }

我无法弄清楚错误!

3 个答案:

答案 0 :(得分:0)

您的图片字符串无效base64。您需要从头开始删除“data:image / png; base64”,以便能够对其进行解码。

答案 1 :(得分:0)

我使用此代码(摘要):

<script>
            var dataFile = {
                nome: file.name,
                size: file.size,
                type: file.type,
            };

            var reader = new FileReader();

            reader.onload = function (evt) {

                dataFile.data = evt.target.result;

                myAngularService.saveFile(dataFile)
                .then(function (success) {
                    if (success.status == 'ok')
                    {
                        ...
                    }

                }, function (error) {
                    ...
                });
            };

            reader.readAsDataURL(file);
</script>

,它在php

 public function save(dataFile) {
        $pos = strpos($dataFile->data, 'base64,');
        $blobData= base64_decode(substr($dataFile->data, $pos + 7));

        ....

        $sql = "INSERT INTO myTable (nameFile, BLOBFile)";
        $sql.= " VALUES(:name, :blobData)";

        $stmt = $this->pdo->prepare($sql);

        $stmt->bindParam(':name', $dataFile->name);
        $stmt->bindParam(':blobData', $blobData, \PDO::PARAM_LOB);

        # save
        $this->pdo->beginTransaction();

        $ret = $stmt->execute();

        $this->pdo->commit();
        ...
    }

答案 2 :(得分:0)

这个为我工作

js

  var dataBlob = base64File.split('data:application/octet-stream;base64,')[1];

ajax

 $.ajax({
    url: 'YOUR_URL',
    type: "POST",
    dataType: "json",
    data:  { 
      data: dataBlob
    },
    headers:  {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Headers': '*',
      'Access-Control-Allow-Methods': '*'
    }
  }).done (function(data) {
    console.log(data);
  }).always (function(data) {
      $("#myStatus").append("<br>" + data.message);
  });
}

php

  $dataFile =  $_POST["data"];  
  $blobData = base64_decode( $dataFile );