【问题标题】:PHP limited by filesize saving a blob in oraclePHP 受文件大小限制,在 oracle 中保存 blob
【发布时间】:2011-01-15 13:34:45
【问题描述】:

我正在使用 php 脚本将存储在服务器临时目录中的二进制文件作为 blob 保存到 oracle。它适用于小于 7MB 的文件大小,任何大于该大小的文件都无法保存。 php 帖子和文件上传限制为 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
}

任何建议将不胜感激。

问候,

安格斯

【问题讨论】:

    标签: php oracle file save blob


    【解决方案1】:

    您可以为您的会话启用跟踪并查看跟踪文件。 也许它会包含导致问题的错误。

    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');

    【讨论】:

      【解决方案2】:

      经过多次调试等问题已经解决。 答案就在这里:

      我在哪里直接访问临时文件,即

      $tempFileN= $_FILES['Filedata']['tmp_name']

      并保存它,我将其替换为:

      <br/>
      $contents = file_get_contents($_FILES['Filedata']['tmp_name']);<br/>
      <br/>
      

      在我使用 savefile 方法保存 blob 的地方,我将其更改为:

      <br/>
      $lob->save($contents)<br/>
      <br/>
      

      现在可以了。

      【讨论】:

        【解决方案3】:

        此示例用于 REST JSON 接口。 此代码还保存大图像。

        <?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();
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 2015-12-07
          相关资源
          最近更新 更多