0

これはよくある質問に違いありませんが、Google からは見つかりませんでした。postgresql の bytea タイプにテーブルと写真の列があります。次のスニペットを使用して、次の画像を保存しています。

$photo->attributes = $_FILES['Photo'];
$file = CUploadedFile::getInstance($photo, 'photo');
$path = Yii::app()->basePath . '/data/' . $file->name;
$file->saveAs($path); //save the file to the $path
$fp = fopen($path, 'rb');
$content = fread($fp, filesize($path));  //get the file content
fclose($fp);
$photo->photo = base64_encode($content);   //encode it
$photo->save();  //save the record to db
unlink(Yii::app()->basePath . '/data/' . $file->name);

保存はうまくいっているようです。

これは、db から blob フィールドを読み取っている場所です。

base64_decode($data->photo) //this call is giving base64_decode() expects parameter 1 to be string, resource given error. 

私が行った場合:

print_r($data->photo) //I am getting: Resource id #51

明らかに$data->photoバイナリ文字列ではなく、リソースとして提供されます。それを機能させる方法はありますか?

前もって感謝します。

4

2 に答える 2

0

私にとって、この解決策は次のとおりです。

ファイルを DB に保存します。

$file = CUploadedFile::getInstanceByName('file');
if ($file!=null) {
    $fp = fopen($file->tempName,'r');
    $content = fread($fp,  $file->size);
    fclose($fp);
    $doc->doc=null;  //bytea field
    $doc->docname = $file->name;
    $doc->mime = $file->type;
    $doc->size = $file->size;
    $doc->save();   
    $msg = $doc->getErrors();
    $command = Yii::app()->db->createCommand('UPDATE '.
                $doc->tableName().' SET "doc"=:doc WHERE id='.$doc->id); 
    $command->bindParam(":doc", $content, PDO::PARAM_LOB); // <-- look this!
    $command->execute();
} 

DB からファイルを表示:

header('Content-Type: '.$doc->mime );
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ($doc->docname ) );
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $doc->size);
$content = fread($doc->doc, $doc->size);
echo $content;
exit;
于 2015-09-07T08:26:29.670 に答える