【问题标题】:Yii2 saving file to Oracle BLOBYii2 将文件保存到 Oracle BLOB
【发布时间】:2015-12-07 22:51:08
【问题描述】:

问题是我无法将文件保存到 blob。它可以正常工作,创建临时文件,我可以从中读取。我检查了它是否要绑定 - 是的,它具有正确的资源值和 \PDO::PARAM_LOB 数据类型。

我有一个 ActiveRecord 类:

class News extends ActiveRecord
{
    public function rules()
    {
        return [
            [
                ['image'],
                'image',
                'extensions' => 'png jpg',
                'maxSize' => 1024 * 300,
            ]
        ];
    }

    public function beforeSave($insert)
    {
        $fileInfo = UploadedFile::getInstance($this, 'image');
        $this->image = fopen($fileInfo->tempName, 'r+');
        return parent::beforeSave($insert);
    }

}

表:

CREATE TABLE NEWS
(
    RN NUMBER(17,0) PRIMARY KEY NOT NULL,
    IMAGE BLOB
);

显示此查询的日志:

INSERT INTO "NEWS" ("IMAGE") VALUES (:qp4) RETURNING "RN" INTO :qp8

所以它实际上并没有绑定它还是什么?

【问题讨论】:

    标签: php oracle yii2 blob


    【解决方案1】:

    看来 PDO_OCI 正在以老式方式与 Oracle 合作,因此您需要先启动事务插入 EMPTY_BLOB(),然后将变量与指向文件的指针绑定,执行语句并提交。

    我已经完成了更新,因为我不想手动进行完整查询。首先,我在save() 方法中将指向文件的指针写入$this->file,并在控制器中调用$model->save && $model->saveImage()

    public function saveImage()
    {
        if (!$this->file) {
            return true;
        }
        $table = self::tableName();
        $rn = $this->rn;
        $command = Yii::$app->getDb()->createCommand(
            "UPDATE $table SET IMAGE=EMPTY_BLOB() WHERE RN=:rn RETURNING IMAGE INTO :image"
        );
        $command->bindParam(':rn', $rn, \PDO::PARAM_STR);
        $command->prepare();
        $command->bindParam(':image', $this->file, \PDO::PARAM_LOB);
        return $command->execute();
    }
    

    【讨论】:

      【解决方案2】:

      您应该简单地使用图像数据而不是资源指针,例如:

      $this->image = file_get_contents($fileInfo->tempName);
      

      编辑:对不起,您是对的,您需要提供一个资源指针才能使用 PARAM_LOB 绑定此参数。

      php doc 所述,您应该尝试使用transaction,例如:

      News::getDb()->transaction(function($db) use ($model) {
          $model->save();
      });
      

      【讨论】:

      • 它给了我 ORA-01461: 只能绑定 LONG 值以插入 LONG 列
      • UploadedFile 源代码判断 - 没有理由这样做。而且,它给出了 ORA-01465: invalid hex number
      • 这对我来说是一笔交易。
      • 你的意思是你已经在使用一个事务?向我们展示您的控制器代码。您是否尝试使用 rb 而不是 r+fopen()
      • 它是在其他级别启动的,不是在控制器中,系统很复杂,但它肯定会启动。我现在试试“rb”。
      猜你喜欢
      • 2018-04-20
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2014-02-21
      • 2021-09-20
      • 2018-06-11
      • 2016-01-28
      相关资源
      最近更新 更多