2015-09-11 16 views
7

Il problema è che non riesco a salvare il file su BLOB. Funziona senza alcun errore, il file temporaneo viene creato e posso leggerlo. Ho controllato se va a legare - sì va con il giusto valore delle risorse e con il tipo di dati \PDO::PARAM_LOB.Yii2 salvataggio del file su Oracle BLOB

Ho una classe 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); 
    } 

} 

Tabella:

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

Logs mostrando questa query:

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

Così ha fatto in realtà non legarlo o cosa?

risposta

0

Sembra che PDO_OCI sta lavorando con Oracle in modo vecchio stile, quindi è necessario iniziare a inserire una transazione EMPTY_BLOB() prima, quindi associare variabile con indice di file, eseguire l'istruzione e impegnarsi.

L'ho fatto con l'aggiornamento, perché non voglio fare una query completa manualmente. Per prima cosa scrivo il puntatore al file in $this->file nel metodo save() e chiama $model->save && $model->saveImage() nel controller.

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(); 
} 
3

Dovresti semplicemente utilizzare i dati immagine invece del puntatore risorsa, ad es. :

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

EDIT: scusa hai ragione, è necessario fornire un puntatore di risorse per essere in grado di legare questo parametro utilizzando PARAM_LOB.

Come indicato in php doc, provare a utilizzare transaction, ad es. :

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

Mi dà ORA-01461: può associare un valore a lungo solo per inserimento in una colonna LONG – UnstableFractal

+0

A giudicare da 'codice sorgente UploadedFile' - non c'è ragione per questo al lavoro. E, bene, dà ORA-01465: numero esadecimale non valido – UnstableFractal

+0

È una transazione per me. – UnstableFractal