sql >> Database >  >> RDS >> Oracle

Hoe te controleren of het bestand een afbeelding is met PL/SQL?

In deze blogpost deel ik een functie waarmee je kunt controleren of een bestand een afbeeldingsbestand is of niet met PL/SQL. Het programma controleert het bestand door de koptekst te lezen en niet de extensienaam van het bestand. Momenteel kan de functie drie soorten afbeeldingen identificeren, namelijk JPG, PNG en GIF.

PL/SQL-functie om te controleren of een bestand een afbeeldingsbestand is

De volgende PL/SQL-functie leest de bestandsheader en retourneert vervolgens het afbeeldingstype in varchar2-gegevenstype. De functie get_image_type heeft twee argumenten en deze zijn als volgt:

  1. Oracle Directory-object (as i_dir) Leer hoe u een Oracle Directory-object maakt.
  2. Bestandsnaam (as i_file) bestand zou in de directory moeten staan.
CREATE OR REPLACE FUNCTION get_image_type (i_dir    IN VARCHAR2,
                                           i_file   IN VARCHAR2)
   RETURN VARCHAR2
AS
   l_bfile       BFILE;
   l_blob        BLOB;
   l_file_type   VARCHAR2 (50);
BEGIN
   DBMS_LOB.createtemporary (l_blob, FALSE);
   l_bfile := BFILENAME (i_dir, i_file);
   DBMS_LOB.fileopen (l_bfile, DBMS_LOB.file_readonly);
   DBMS_LOB.loadfromfile (l_blob, l_bfile, DBMS_LOB.getlength (l_bfile));
   DBMS_LOB.fileclose (l_bfile);

   IF RAWTOHEX (DBMS_LOB.SUBSTR (l_blob, 8, 1)) = '89504E470D0A1A0A'
   THEN
      l_file_type := 'PNG';
   ELSIF DBMS_LOB.SUBSTR (l_blob, 3, 1) = '474946'
   THEN
      l_file_type := 'GIF';
   ELSIF RAWTOHEX (DBMS_LOB.SUBSTR (l_blob, 3, 1)) = 'FFD8FF'
   THEN
      l_file_type := 'JPG';
   ELSE
      l_file_type := 'The file is not an image.';
   END IF;

   RETURN l_file_type;
EXCEPTION
   WHEN OTHERS
   THEN
      IF DBMS_LOB.fileisopen (l_bfile) = 1
      THEN
         DBMS_LOB.fileclose (l_bfile);
      END IF;

      DBMS_LOB.freetemporary (l_blob);
      RETURN 'The file does not exists.';
END get_image_type;

Test

Wijzig in het onderstaande PL/SQL-programma het Oracle-directoryobject MY_FILES met uw directory-object en wijzig de bestandsnaam met het bestand dat beschikbaar is in de directorylocatie MY_FILES.

SET SERVEROUTPUT ON;

DECLARE
   i_image_type   VARCHAR2 (50);
BEGIN
   i_image_type := get_image_type ('MY_FILES', 'oracle-logo-gif-to-use.gif');

   IF i_image_type IN ('JPG', 'GIF', 'PNG')
   THEN
      DBMS_OUTPUT.put_line ('The file is a valid ' || i_image_type || ' image.');
   ELSE
      DBMS_OUTPUT.put_line (i_image_type);
   END IF;
END;
/

Uitvoer

The file is a valid GIF image.
PL/SQL procedure successfully completed.

Zie ook:

  • Hoe voeg ik een bestand in een Oracle-tabel in met PL/SQL?
  1. Een gids voor het implementeren van TimescaleDB met Docker

  2. pyodbc kan geen verbinding maken met de database

  3. Retourneer alle niet-berekende kolommen uit een tabel in SQL Server

  4. Retourneer de n-de record van MySQL-query