Загрузка, сжатие и сохранение изображения в базу данных oracle в виде большого двоичного объекта
Я здесь новичок, и это первый вопрос, который я задаю этому сообществу, я буду максимально ясен, поэтому прежде всего я объясню проблему:
В компании, в которой я работаю, мы используем веб-систему, которая управляет всеми расходами консультантов, и за каждый расход они ЗАГРУЖАЮТ ИЗОБРАЖЕНИЕ квитанции (которое можно сделать непосредственно с помощью камеры своего телефона). Эти ИЗОБРАЖЕНИЯ затем ВСТАВЛЯЮТСЯ в базу данных ORACLE в виде ФАЙЛОВ больших ДВОИЧНЫХ ОБЪЕКТОВ.
Тогда проблема заключается в том, что количество загруженные файлы замедляют работу системы, поэтому цель состоит в том, чтобы найти способ СЖАТИЯ больших изображений (потому что качество не важно, им нужно только прочитать информацию об оплате) во время ЗАГРУЗКИ, а затем СОХРАНИТЬ в БД в виде большого двоичного объекта. файл.
Короче говоря, я покажу вам уже работающий код и некоторые методы, которые я пробовал.. давайте вместе найдем решение.
Это форма загрузки: (Я опустил скрытую информацию, которая полезна для запроса, но не важна здесь)
<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
2 answers
Я полагаю, что вы можете начать с проверки того, действительно ли изменение размера работает. Являются ли новые измерения теми, которые вы ожидаете?
$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);
Решение Найдено!
Поскольку изображение напрямую сохраняется в базе данных, каждый процесс на нем не влияет на фактический размер файла.
Поэтому я написал функцию, которая берет изображение, обрабатывает и сохраняет его во временной папке, а затем я, наконец, могу сохранить его в БД с большой экономией места на диске.
Для обработки изображений я использовал расширение PHP GD, в Интернете есть много учебников, поэтому я не собираюсь публиковать свой код.
Приветствия :)