【问题标题】:Upload, compress and save an image into oracle database as blob将图像作为 blob 上传、压缩并保存到 oracle 数据库中
【发布时间】:2017-11-30 06:27:17
【问题描述】:

我是新来的,这是我向这个社区提出的第一个问题,我会尽可能清楚,所以首先我解释一下这个问题:

在我工作的公司,我们使用一个网络系统来管理顾问支付的所有费用,并且对于每笔费用,他们都会上传收据的图像(可以直接用他们手机的摄像头制作)。然后将此图像作为 BLOB 文件插入到 ORACLE DB 中。

然后问题是上传的文件数量会减慢系统速度,因此我们的目标是在上传期间找到一种压缩大图像的方法(因为质量并不重要,他们只需要读取付款信息​​)和然后保存到数据库中的 BLOB 文件中。

长话短说,我向您展示已经工作的代码和我尝试过的一些方法..让我们一起找到解决方案。

这是上传表单:(我省略了对查询有用但在这里不重要的隐藏信息)

<form action="uploadPage.php" method="POST" data-ajax="false" enctype="multipart/form-data">
    <br>
        <center><h3>Allega foto</h3></center>
            <input  type="file"     id="uploadfile"     name="lob_upload"       value="" accept="image/*" onchange="controlloAllegato();" />
            <button type="submit"   id="allegaSpese"    name="allegaSpese"      value="submit" onclick="loadFile();" disabled>Inserisci</button>
</form>

因此,文件上传后,操作将其发送到一个处理插入到数据库中的 Php 文件中:

第一步,它检索有关文件的信息

$tipo = $_FILES['lob_upload']['type'];
$dimensione = $_FILES['lob_upload']['size'];
$name = pathinfo($filename, PATHINFO_FILENAME);
$estensione =  strtolower(pathinfo($filename, PATHINFO_EXTENSION));

然后它运行查询

$lob = oci_new_descriptor($conn, OCI_D_LOB);
    $stmt = oci_parse($conn, "INSERT INTO ALLEGATI_SPESE (NUMRIGA, COMMESSA, RISORSA, DATA, DATA_INS, NOME, ESTENSIONE, TIPO, DIMENSIONE, ALLEGATO) "        
        ."VALUES(:NUM,:COM,:RIS,TO_DATE(:DATA,'DD/MM/YYYY'),DEFAULT,:NOME,:EXT,:TIPO,:DIMENSIONE,empty_blob()) returning allegato into :ALLEGATO");

        oci_bind_by_name($stmt, ":NUM", $numriga);
        oci_bind_by_name($stmt, ":COM", $commessa);
        oci_bind_by_name($stmt, ":RIS", $risorsa);
        oci_bind_by_name($stmt, ":DATA", $data);
        oci_bind_by_name($stmt, ":NOME", $name);
        oci_bind_by_name($stmt, ":EXT", $estensione);
        oci_bind_by_name($stmt, ":TIPO", $tipo);
        oci_bind_by_name($stmt, ":DIMENSIONE", $dimensione);
        oci_bind_by_name($stmt, ":ALLEGATO", $lob, -1, OCI_B_BLOB);
        oci_execute($stmt, OCI_DEFAULT);

最后是图像实际保存到数据库中的部分,还有一个调整大小,但它不影响文件大小。(这个调整大小功能在这里是出于其他原因,我知道它是不影响文件;))我有点想做同样的事情,但在文件保存之前。

    if ($lob->savefile($_FILES['lob_upload']['tmp_name'])) {
        $blob=$lob->load();
        $image = new Imagick();
        $image->readImageBlob($blob);

        $width = $image->getImageWidth();
        $height=$image->getImageHeight();
        $scale=$width/$height;
        $height=1000/$scale;
        $image->resizeImage(1000,$height,Imagick::FILTER_LANCZOS,1);
        $lob->save($image);
        oci_commit($conn);

    }else{
        // echo "Errore";
    }
    $lob->free();

所以我的最后一个问题是:有没有办法在文件保存到数据库之前处理/压缩文件? 我已经尝试分配这个

$_FILES['lob_upload']['tmp_name']

到一个变量,以便随后对其应用一些 Imagick() 压缩函数,但它不起作用。

仅此而已,如果有不清楚的地方请告诉我,提前感谢您的宝贵时间。

ps:这是我想做的一个例子,除了我正在使用 Oracle 数据库,目前我无法启用 GD 库,只能启用 Imagick http://talkerscode.com/webtricks/reduce%20the%20size%20and%20make%20thumbnail%20of%20any%20image%20before%20uploading%20using%20PHP.php

【问题讨论】:

    标签: php oracle image compression blob


    【解决方案1】:

    我相信您可以先检查调整大小是否真的有效。 新维度是否符合您的预期?

    $width = $image->getImageWidth();
    $height=$image->getImageHeight();
    $scale=$width/$height;
    $height=1000/$scale;
    $image->resizeImage(1000,$height,Imagick::FILTER_LANCZOS,1);
    
    $resizedWidth = $image->getImageWidth();
    $resizedHeight = $image->getImageHeight();
    
    var_dump($resizedWidth);
    var_dump($resizedHeight);
    

    【讨论】:

    • 是的,我已经检查过了,它可以工作,我还尝试使用 Imagick 压缩功能,它会影响图像,但如果我从数据库下载它(使用 sql 开发人员)并将其与原来占用的磁盘空间是一样的。编写此代码的人向我证实,这是在文件保存到数据库后执行的调整大小,因此它会影响图像的查看方式,但不会影响其余部分。我的目标是在 $lob->savefile($_FILES['lob_upload']['tmp_name']) 之前处理它。感谢您的回复:)
    • 您是否也检查了存储图像内容的oracle中的字段大小?另外,您所指的调整大小到底发生在哪里?
    • resize 函数发生在这里 $image->resizeImage(1000,$height,Imagick::FILTER_LANCZOS,1);如果我更改前两个值,它确实会更改为数据库视图,但大小仍然保持不变,这是因为文件已被保存:)
    • 对于字段大小,因为取自 hiddenhtml 是固定的,所以它也不会改变
    【解决方案2】:

    找到解决方案!

    由于图片是直接存入数据库的,所以对图片的每一个处理都不会影响文件的实际大小。

    因此我编写了一个函数来获取图像,处理并将其存储到一个临时文件夹中,然后我终于能够将它保存到数据库中,从而节省大量磁盘空间。

    图片处理我用的是​​PHP GD Extension,网上有很多教程,我就不贴代码了。

    干杯:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2020-12-16
      • 2019-09-14
      相关资源
      最近更新 更多