將近花了兩天實現,實現了空間化文獻的批量上傳。原來文獻是以檔案的形式存放在網站目錄下的檔案夾裡的,後來改為存放到PostgreSQL的Bytea欄位中,該欄位相當於ORACLE的BLOB或CLOB欄位,是以二級制形式存放資料,最大存放2G資料。
自己對PHP編程不熟,是在查閱大量參考資料後,依葫蘆畫瓢才搞定的Postgesql資料庫Bytea欄位的讀、寫操作。現在與大家分享一下:
首先,PHP串連Postgresql資料庫,需要修改PHP安裝目錄下的php.ini檔案,啟用 extension=php_pdo_pgsql.dll 和extension=php_pgsql.dll。
//建立資料庫連接
function CreatePGConnect()
{
$host="localhost";
$port="5432";
$dbname="glc";
$user="postgres";
$password="gxsnprg2010";
$dbconn=pg_connect("host=$host port=$port dbname=$dbname user=$user password=$password");
return $dbconn;
}
將文獻資料寫入Bytea欄位關鍵代碼
$dbconn=CreatePGConnect(); //資料庫連接 //將檔案插入資料庫的tb_doc_res_data
$tmpFile=iconv("utf-8","gbk",$tmpFile); //$tmpFile為檔案名稱,此處為處理中文亂碼
$data=file_get_contents(UPLOAD_FILE_PATH.$tmpFile);//文獻的完整路徑
$escaped=pg_escape_bytea($data); //關鍵處
$insertSQL="insert into tb_doc_res_data values(".$tb_docmaxid.",'{$escaped}')";
$result3=pg_query($dbconn,$insertSQL); //執行插入語句命令
讀取Bytea欄位值,並儲存為PDF檔案
代碼
///將檔案從資料庫中讀出
function readBlob()
{
$dbconn=CreatePGConnect(); //資料庫連接
$insertSQL="select filecontent from tb_doc_res_data where DocID=5";//查詢語句
$query=pg_query($dbconn,$insertSQL);
$row=pg_fetch_result($query,'filecontent');
$filecontent=pg_unescape_bytea($row); //獲得位元據
file_put_contents(UPLOAD_FILE_PATH.'11.pdf',$filecontent); //將位元據轉為PDF檔案
return "OK";
}
參考資料:
http://php.net/manual/en/function.pg-unescape-bytea.php
http://www.phpf1.com/manual/pg-escape-bytea.html
http://www.phpf1.com/manual/pg-unescape-bytea.html
http://bytes.com/topic/php/answers/157633-storing-images-postgresql-php
http://www.zephid.dk/2008/08/09/oid-vs-bytea-in-postgresql/
http://www.zhougang.name/?p=395
本部落格聲明:本人的技術探索過程中,得到了國信司南公司方面支援。今後,本人部落格裡的所有技術探索成果將歸“無痕客”、“國信司南”和“部落格園”三方共同所有,原創作品如需轉載,請註明本部落格聲明。