当前位置: 首页 > 知识库问答 >
问题:

用PL/SQL将base64图像解码为BLOB

唐增
2023-03-14

我使用下面的脚本从MongoDB中获取JSON文件,对其进行解析,然后将其插入到Oracle表中。

>

  • 该脚本可以正确地将所有值插入到Oracle表中。这包括值Photo,它是一个base64 formate的图像,它比32KB大得多。
  • 表Appery_Photos中的列Photo是CLOB类型,而列DecodedPhoto是BLOB类型。

    问题在于bloboriginent:=base64decode1(Photo);行,我用它将CLOB解码为BLOB。函数base64decode1已经被几个函数替换(即decode_base64、base64decodelobasblob_plsql、base64decode、from_base64,最后是json_ext.decode)。

    结果对他们所有人都是一样的。也就是说,生成的BLOB对象不能在任何图像编辑器中作为图像打开(我正在使用Oracle SQL Developer下载它)。

    我检查了CLOB,找不到任何换行\n,也找不到任何空格(只找到+号)。此外,我将CLOB值插入到base64-image-converter中,它可以正确地显示图像。此外,为了进一步验证(使用上面链接中提供的相反函数),我尝试在base64中对结果BLOB进行编码,结果base64根本不一样。

         BEGIN
          l_http_request := UTL_HTTP.begin_request('https://api.appery.io/rest/1/db/collections/Photos?where=%7B%22Oracle_Flag%22%3A%22Y%22%7D' , 'GET' , 'HTTP/1.1');
          -- ...set header's attributes
          UTL_HTTP.set_header(l_http_request, 'X-Appery-Database-Id', '53f2dac5e4b02cca64021dbe');
          l_http_response := UTL_HTTP.get_response(l_http_request);
          BEGIN
            LOOP
              UTL_HTTP.read_text(l_http_response, buf);
              l_response_text := l_response_text || buf;
            END LOOP;
          EXCEPTION
          WHEN UTL_HTTP.end_of_body THEN
            NULL;
          END;
          l_list := json_list(l_response_text);
          FOR i IN 1..l_list.count
          LOOP
            A_id  := json_ext.get_string(json(l_list.get(i)),'_id');
            l_val := json_ext.get_json_value(json(l_list.get(i)),'Photo');
            dbms_lob.createtemporary(Photo, true, 2);
            json_value.get_string(l_val, Photo);
            dbms_output.put_line(dbms_lob.getlength(Photo));
            dbms_output.put_line(dbms_lob.substr(Photo, 20, 1));
            blobOriginal := base64decode1(Photo);
            A_Name       := json_ext.get_string(json(l_list.get(i)),'Name');
            Remarks      := json_ext.get_string(json(l_list.get(i)),'Remarks');
            Status       := json_ext.get_string(json(l_list.get(i)),'Status');
            UserId       := json_ext.get_string(json(l_list.get(i)),'UserId');
            A_Date       := json_ext.get_string(json(l_list.get(i)),'Date');
            A_Time       := json_ext.get_string(json(l_list.get(i)),'Time');
            MSG_status   := json_ext.get_string(json(l_list.get(i)),'MSG_status');
            Oracle_Flag  := json_ext.get_string(json(l_list.get(i)),'Oracle_Flag');
            acl          := json_ext.get_string(json(l_list.get(i)),'acl');
          INSERT
            INTO Appery_Photos
              (
                A_id,
                Photo,
                DecodedPhoto,
                A_Name,
                Remarks,
                Status,
                UserId,
                A_Date,
                A_Time,
                MSG_status ,
                Oracle_Flag,
               acl
              )
              VALUES
              (
                A_id,
                Photo,
                blobOriginal,
                A_Name,
                Remarks,
                Status,
                UserId,
                A_Date,
                A_Time,
                MSG_status ,
                Oracle_Flag,
                acl
              );
            dbms_lob.freetemporary(Photo);
          END LOOP;
          -- finalizing
          UTL_HTTP.end_response(l_http_response);
        EXCEPTION
        WHEN UTL_HTTP.end_of_body THEN
          UTL_HTTP.end_response(l_http_response);
        END;
    

    我们非常感谢您的帮助。

  • 共有1个答案

    景安翔
    2023-03-14

    我发现这不是我在base64解码中使用的函数。相反,我的值不是base64编码的字符串,而是base64编码的Datauri的,类似于

    数据:图像/JPEG;base64,/9J/4AAQSKZJRGABAQAAA

    所以我必须使用类似于:clobbase642blob(substr(Photo,instr(Photo,',')+1))

    以下脚本的灵感来自Oracle Community answer

    DECLARE
      l_param_list VARCHAR2(512);
      l_http_request UTL_HTTP.req;
      l_http_response UTL_HTTP.resp;
      l_response_text CLOB;
      --l_response_text  VARCHAR2(32767);
      buf VARCHAR2(32767);
      l_list json_list;
      l_val json_value;
      A_id VARCHAR2(100);
      Photo CLOB;
      A_Name      VARCHAR2(100);
      Remarks     VARCHAR2(100);
      Status      VARCHAR2(100);
      UserId      VARCHAR2(100);
      A_Date      VARCHAR2(100);
      A_Time      VARCHAR2(100);
      MSG_status  VARCHAR2(100);
      Oracle_Flag VARCHAR2(100);
      acl         VARCHAR2(100);
      obj json_list;
      blobOriginal BLOB := empty_blob();
      clobInBase64 CLOB;
      substring VARCHAR2(2000);
      tmp BLOB;
      n pls_integer                := 0;
      substring_length pls_integer := 2000;
      ------------------------------------------------------
      FUNCTION clobbase642blob(
          p_clob CLOB )
        RETURN BLOB
      IS
        t_blob BLOB;
        t_buffer VARCHAR2(32767);
        t_pos    NUMBER := 1;
        t_size   NUMBER := nls_charset_decl_len( 32764, nls_charset_id( 'char_cs' ) );
        t_len    NUMBER;
        t_tmp raw(32767);
      BEGIN
        dbms_lob.createtemporary( t_blob, true );
        t_len := LENGTH( p_clob );
        LOOP
          EXIT
        WHEN t_pos     > t_len;
          t_buffer    := REPLACE( REPLACE( SUBSTR( p_clob, t_pos, t_size ), chr(10) ), chr(13) );
          t_pos       := t_pos + t_size;
          WHILE t_pos  0
          LOOP
            t_buffer := t_buffer || REPLACE( REPLACE( SUBSTR( p_clob, t_pos, 1 ), chr(10) ), chr(13) );
            t_pos    := t_pos + 1;
          END LOOP;
          t_tmp := utl_encode.base64_decode( utl_raw.cast_to_raw( t_buffer ) );
          dbms_lob.writeappend( t_blob, utl_raw.length( t_tmp ), t_tmp );
        END LOOP;
        RETURN t_blob;
      END;
      ------------------------------------------------------
      BEGIN
        -- service's input parameters
        -- preparing Request...
        l_http_request := UTL_HTTP.begin_request('https://api.appery.io/rest/1/db/collections/Photos?where=%7B%22Oracle_Flag%22%3A%22Y%22%7D' , 'GET' , 'HTTP/1.1');
        -- ...set header's attributes
        UTL_HTTP.set_header(l_http_request, 'X-Appery-Database-Id', '53f2dac5e4b02cca64021dbe');
        l_http_response := UTL_HTTP.get_response(l_http_request);
        BEGIN
          LOOP
            UTL_HTTP.read_text(l_http_response, buf);
            l_response_text := l_response_text || buf;
          END LOOP;
        EXCEPTION
        WHEN UTL_HTTP.end_of_body THEN
          NULL;
        END;
        l_list := json_list(l_response_text);
        FOR i IN 1..l_list.count
        LOOP
          A_id := json_ext.get_string(json(l_list.get(i)),'_id');
          --deal with base64 URI photo >32KB
          l_val := json_ext.get_json_value(json(l_list.get(i)),'Photo');
          dbms_lob.createtemporary(Photo, true, 2);
          json_value.get_string(l_val, Photo);
          --dbms_output.put_line(dbms_lob.getlength(Photo));
          --dbms_output.put_line(dbms_lob.substr(Photo, 20, 1));
          blobOriginal := clobbase642blob( SUBSTR( Photo, 24 ) );
          A_Name       := json_ext.get_string(json(l_list.get(i)),'Name');
          Remarks      := json_ext.get_string(json(l_list.get(i)),'Remarks');
          Status       := json_ext.get_string(json(l_list.get(i)),'Status');
          UserId       := json_ext.get_string(json(l_list.get(i)),'UserId');
          A_Date       := json_ext.get_string(json(l_list.get(i)),'Date');
          A_Time       := json_ext.get_string(json(l_list.get(i)),'Time');
          MSG_status   := json_ext.get_string(json(l_list.get(i)),'MSG_status');
          Oracle_Flag  := json_ext.get_string(json(l_list.get(i)),'Oracle_Flag');
          acl          := json_ext.get_string(json(l_list.get(i)),'acl');
          INSERT
          INTO Appery_Photos
            (
              A_id,
              Photo,
              DecodedPhoto,
              A_Name,
              Remarks,
              Status,
              UserId,
              A_Date,
              A_Time,
              MSG_status ,
              Oracle_Flag,
              acl
            )
            VALUES
            (
              A_id,
              Photo,
              blobOriginal,
              A_Name,
              Remarks,
              Status,
              UserId,
              A_Date,
              A_Time,
              MSG_status ,
              Oracle_Flag,
              acl
            );
          dbms_lob.freetemporary(Photo);
        END LOOP;
        -- finalizing
        UTL_HTTP.end_response(l_http_response);
      EXCEPTION
      WHEN UTL_HTTP.end_of_body THEN
        UTL_HTTP.end_response(l_http_response);
      END;
      /
    
     类似资料:
    • 问题内容: 我目前正在从画布上获取像这样的base64图像数据URL(不是dataURL我只是为了显示字符串的样子) 我需要解码该图像以检查图像的宽度和高度 但是我在尝试解码配置时收到错误 因此,是的,我制作dataurl的方式一定是错误的,但无法弄清楚该怎么做。我也尝试传递完整的dataurl(with data:image …)仍然没有成功 问题答案: 您所拥有的是数据URI方案,有关如何对其

    • 我有一个编码为base64的SVG文件,我想用ImageView显示图像。这是我尝试过的: 但是decodedByte总是返回null。 附注: 此代码适用于jpeg图像。 如果Bas64字符串包含Bas64前缀("data: Image/svg xml; Bas64,"或"data: Image/jpeg; Bas64,),则decdedByte也总是返回null Bas64字符串是正确的(它在

    • 我想采取一个当前的base64编码的图像,并使用一个简短的哈希说“84dskh”,以“加密”的图像到另一个完全有效的base64编码图像。 原始图像不必经过base64编码,最终我想要原始图像的加密图像,但它仍然是一个可以在img标记中显示的有效图像:。 最好使用JavaScript。

    • 问题内容: 您能否指导我如何将图像从URL转换为base64编码? 问题答案: 我认为应该是:

    • 问题内容: 我正在为Firefox / IE构建一个开放式搜索附加组件,并且该图像需要经过Base64编码,因此如何对我拥有的收藏夹图标进行64位编码? 我只熟悉PHP 问题答案: 据我记得,图像数据有一个xml元素。您可以使用此网站对文件进行编码(使用上载字段)。然后,只需将数据复制并粘贴到XML元素即可。 您也可以这样使用PHP来做到这一点: 使用Mozilla指南获取有关创建OpenSear

    • 我有申请发邮件。图书馆使用了斯威夫特·梅勒。我已经生成了用于发送电子邮件html字符串,其中包含各种标记,包括标记我可以将img src标记转换为bas64图像吗 至