我是新来的,这是我对这个社区做的第一个问题,我会尽可能地清楚,所以首先我要解释一下这个问题:
在我工作的公司,我们使用一个网络系统来管理顾问所做的所有费用,并且每次花费他们上传收据的图像(可以直接用他们的手机的相机制作) )。然后将此IMAGES作为BLOB FILES插入到ORACLE DB中。
问题是,上传的文件数量会减慢系统的速度,因此目的是找到一种方法来处理大型图像(因为质量不重要,他们只需阅读UPLOAD期间的支付信息,然后将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文件中,该文件处理插入到db:
第一步,它检索有关文件的信息
$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
答案 0 :(得分:0)
我相信你可以先检查调整大小是否真的有效。 新尺寸是您期望的尺寸吗?
$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);
答案 1 :(得分:0)
找到解决方案!
由于图像直接保存到数据库中,因此每个进程都不会影响文件的实际大小。
因此我写了一个函数,它将图像处理并存储到一个临时文件夹中,然后我终于可以将它保存到数据库中并节省大量磁盘空间。
对于我使用PHP GD Extension的图像处理,网上有很多教程,所以我不会发布我的代码。
干杯:)