Загрузка, сжатие и сохранение изображения в базу данных 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

Author: David Iho, 2017-06-27

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);
 0
Author: mufax, 2017-06-27 09:27:01

Решение Найдено!

Поскольку изображение напрямую сохраняется в базе данных, каждый процесс на нем не влияет на фактический размер файла.

Поэтому я написал функцию, которая берет изображение, обрабатывает и сохраняет его во временной папке, а затем я, наконец, могу сохранить его в БД с большой экономией места на диске.

Для обработки изображений я использовал расширение PHP GD, в Интернете есть много учебников, поэтому я не собираюсь публиковать свой код.

Приветствия :)

 0
Author: David Iho, 2017-06-30 12:22:56