【发布时间】: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