Я пытаюсь вставить PDF или изображение как blob в postgresql bytea. Вот что я пробовал
$file = $_FILES['attachments']['tmp_name'][$i];
if($file != '') {
$p = fopen($file,'r');
$data = fread($p,filesize($file));
$data = addslashes($data);
// $data = file_get_contents($file);
$escaped_data = pg_escape_bytea($data);
$ext = pathinfo($_FILES['attachments']['name'][$i], PATHINFO_EXTENSION);
$blobQuery = $dbconn->prepare("INSERT INTO app_blob(blob_name, blob_type, blob_date, blob_data) values(:blob_name,:blob_type,NOW(),:blob_data) RETURNING blob_id");
$blobQuery->bindParam(':blob_data', $escaped_data, PDO::PARAM_LOB);
$blobQuery->bindParam(':blob_name', $_FILES['attachments']['name'][$i]);
$blobQuery->bindParam(':blob_type', $ext);
$blobQuery->execute();
$blob_id = $blobQuery->fetchColumn();
}
Я пробовал и по-разному, например, без указания типа параметра. Я либо получаю пустой белый pdf, либо испорченный. Каков наилучший способ достичь того, чего я хочу здесь?
Я просто узнал, что я делаю неправильно. Я отправляю обновленный код здесь, если кто-то попадает в подобную проблему позже, и мне нужна помощь. Как уже упоминалось Craig мы не должны использовать pg_escape_bytea
или addslashes
. Все, что нам нужно, - просто открыть файл с помощью fopen и в моем случае в двоичном формате и связать параметр, определяющий тип параметра как PDO::PARAM_LOB
.
$file = $_FILES['attachments']['tmp_name'][$i];
if($file != '') {
$p = fopen($file,'rb');
$ext = pathinfo($_FILES['attachments']['name'][$i], PATHINFO_EXTENSION);
$blobQuery = $dbconn->prepare("INSERT INTO app_blob(blob_name, blob_type, blob_date, blob_data) values(:blob_name,:blob_type,NOW(),:blob_data) RETURNING blob_id");
$blobQuery->bindParam(':blob_data', $p, PDO::PARAM_LOB);
$blobQuery->bindParam(':blob_name', $_FILES['attachments']['name'][$i]);
$blobQuery->bindParam(':blob_type', $ext);
$blobQuery->execute();
$blob_id = $blobQuery->fetchColumn();
$mime_type = $_FILES['attachments']['type'][$i];
$attachmentQuery = $dbconn->prepare("INSERT INTO msg.email_attachment(email_id,blob_id,mime_type,is_in_line) values($email_id,$blob_id,:mime_type,1)");
$attachmentQuery->execute(array(
':mime_type' => $mime_type
));
}
эта ссылка может помочь, когда я попал в решение.
pg_escape_bytea
илиpg_unescape_bytea
. Просто передайтеPDO::PARAM_LOB
.