Php 将图像作为blob上传、压缩并保存到oracle数据库中

Php 将图像作为blob上传、压缩并保存到oracle数据库中,php,oracle,image,compression,blob,Php,Oracle,Image,Compression,Blob,我是新来的,这是我对这个社区提出的第一个问题,我会尽可能清楚,所以首先我要解释这个问题: 在我工作的公司里,我们使用一个网络系统来管理顾问的所有费用,对于每一笔费用,他们都会上传收据的图像(可以直接用他们手机的摄像头拍摄)。然后将这些图像作为BLOB文件插入到ORACLE数据库中 问题是上传的文件数量会减慢系统速度,因此目标是找到一种方法在上传过程中压缩大型图像(因为质量不重要,他们只需要读取支付信息),然后将其保存到数据库中的BLOB文件中 长话短说,我向您展示了已经运行的代码和我尝试过的一些

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

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

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

长话短说,我向您展示了已经运行的代码和我尝试过的一些方法。。让我们一起找到解决办法

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

然后运行查询

$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);
最后是图像实际保存到db中的部分,还有一个调整大小功能,但它不会影响文件大小。(这个调整大小功能是出于其他原因,我知道它不会影响文件;)我有点想做同样的事情,但在文件保存之前

    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

我相信您可以先检查调整大小是否有效。 新的维度是你所期望的吗

$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);
找到解决方案

由于图像直接保存到数据库中,因此图像上的每个进程都不会影响文件的实际大小

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

对于图像处理,我使用了PHPGD扩展,网上有很多教程,所以我不想发布我的代码


干杯:)

是的,我已经检查过了,它可以工作,我也尝试过使用Imagick压缩功能,它会影响图像,但是如果我从db(使用sql developer)下载它,并将其与原始图像进行比较,则占用的磁盘空间是相同的。编写这段代码的人向我证实,这是一个在文件保存到数据库后进行的调整大小操作,因此它会影响图像的查看方式,但不会影响其余部分。我的目标是在$lob->savefile($\u FILES['lob\u upload']['tmp\u name'])之前处理它。感谢您的回复:)您是否也检查了存储图像内容的oracle中的字段大小?另外,您所指的调整大小功能具体发生在哪里?调整大小功能发生在这里$image->resizeImage(1000,$height,Imagick::FILTER_LANCZOS,1);如果我更改前两个值,它确实会更改为数据库视图,但大小仍然保持不变,这是因为文件已被保存:)对于字段大小,因为是从hiddenhtml中获取的,所以它是固定的,因此也不会更改
$_FILES['lob_upload']['tmp_name']
$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);