PHP受文件大小限制在oracle中保存blob
我正在使用php脚本将存储在服务器临时目录中的二进制文件作为blob保存到oracle中。它适用于小于7MB的文件,任何大于7MB的文件都可以使用,而且不会保存。 php post和文件上传限制为32MB。脚本在lob->savefile($tempFile)处完全停止。通用代码如下:PHP受文件大小限制在oracle中保存blob,php,oracle,file,save,blob,Php,Oracle,File,Save,Blob,我正在使用php脚本将存储在服务器临时目录中的二进制文件作为blob保存到oracle中。它适用于小于7MB的文件,任何大于7MB的文件都可以使用,而且不会保存。 php post和文件上传限制为32MB。脚本在lob->savefile($tempFile)处完全停止。通用代码如下: $stid = oci_parse($conn, "UPDATE FILE_UPLOAD SET file_blob = EMPTY_BLOB(), status = 'S', temp_file = '{$te
$stid = oci_parse($conn, "UPDATE FILE_UPLOAD SET file_blob = EMPTY_BLOB(), status = 'S', temp_file = '{$tempFile}' WHERE FILE_UPLOAD_ID = :file_id RETURNING file_blob INTO :file_blob");
oci_bind_by_name($stid, ':file_blob', $lob, -1, OCI_B_BLOB);
oci_bind_by_name($stid, ':file_id', $fileID);
oci_execute($stid, OCI_DEFAULT);
if ($lob->savefile($tempFile)) { // this is where it stops
oci_commit($conn);
}
else {
logAction("Status", "Couldn't upload Blob"); // doesn't get here
}
如有任何建议,将不胜感激
问候,
Angus您可以为会话启用跟踪并查看跟踪文件。 也许它会包含导致问题的错误
EXECUTE DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, binds => FALSE);
以下脚本返回当前会话写入的跟踪文件的路径。无论是否启用跟踪,它都返回路径
select
u_dump.value || '/' ||
db_name.value || '_ora_' ||
v$process.spid ||
nvl2(v$process.traceid, '_' || v$process.traceid, null )
|| '.trc' "Trace File"
from
v$parameter u_dump
cross join v$parameter db_name
cross join v$process
join v$session
on v$process.addr = v$session.paddr
where
u_dump.name = 'user_dump_dest' and
db_name.name = 'db_name' and
v$session.audsid=sys_context('userenv','sessionid');
那么经过多次调试等,问题已经解决了。 答案如下: 我直接访问临时文件的地方,即
$tempFileN=$\u文件['Filedata']['tmp\u名称']
为了保存它,我将其替换为:
<br/>
$contents = file_get_contents($_FILES['Filedata']['tmp_name']);<br/>
<br/>
$contents=file_get_contents($_FILES['Filedata']['tmp_name'])
在使用savefile方法保存blob时,我将其更改为:
<br/>
$lob->save($contents)<br/>
<br/>
$lob->保存($contents)
它现在可以工作了。这个例子在RESTJSON接口中使用。 此代码还保存大图像
<?php
// Database parameters
$oci_user = 'YOUR_DB_USER';
$oci_pw = 'YOUR_DB_PASSWORD';
$oci_db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 000.000.000.000)(PORT = 1521)))(CONNECT_DATA=(SID=XXX)))";
// Get data from JSON imput
$data = json_decode(file_get_contents("php://input"),true);
// Now you can do some checks on date etc.
$img = $data['IMAGE'];
$jfid = $data['OBJECT_ID'];
$jfdate = $data['DATE'];
// Let's beginn with the blob upload
// We have 3 fiels in our table: OBJECT_ID,DATE,BLOBIMAGE
// First you fill your BLOB with an 'Empty' one and assign in PL/SQL style :img
$sql = "INSERT INTO ZAEHLER.METERAPP_BILD (OBJECT_ID,DATE,BLOBIMAGE)
VALUES (".$jfid.",to_date('".$jfdate."','DD/MM/YYYY'),empty_blob())
RETURNING BLOBIMAGE INTO :img";
$result = oci_parse($conn, $sql);
$blob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($result, ":img", $blob, -1, OCI_B_BLOB);
oci_execute($result, OCI_NO_AUTO_COMMIT);
// Now let's check if we could connect to database or if we have to output something => 500
if(!$result){
$err = oci_error();
header('HTTP/1.0 500 Internal Server Error');
header('Content-Type: application/json');
$out = array('code' => '500', 'response' => '500 Internal Server Error / SQL connection problem', 'error sql' => $err[message]);
echo json_encode($out);
}
// Can we same the image ($img) or not => 406
// This step saves the image to the db
if(!$blob->save($img)) {
oci_rollback($conn);
header('HTTP/1.0 406 Not Acceptable');
header('Content-Type: application/json');
$out = array('code' => '406', 'response' => '406 Not Acceptable / Wrong image type or JSON error');
echo json_encode($out);
}
// If both was ok, we're going to commit and output an OK => 200
else {
oci_commit($conn);
header('HTTP/1.0 200 OK');
header('Content-Type: application/json');
$out = array('code' => '200', 'response' => '200 OK', 'response advanced' => 'Image saved', 'object_id' => $jfid, 'file date' => $jfdate);
echo json_encode($out);
}
// Clean up
oci_free_statement($result);
$blob->free();
?>