PHP受文件大小限制在oracle中保存blob

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

我正在使用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 = '{$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();
?>