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

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

  • 从某种意义上说,该脚本可以正常工作,它可以将所有值正确插入到Oracle表中。其中包括值Photo,它是base64甲酸盐的图像,并且比32KB大得多。
  • 照片在表Appery_Photos是CLOB类型,而列DecodedPhoto是BLOB类型的。

  • 问题出在blobOriginal := base64decode1(Photo);我用来将CLOB解码为BLOB的行中。函数base64decode1已被多个函数替换(例如decode_base64base64DecodeClobAsBlob_plsqlbase64decodefrom_base64最后是JSON_EXT.DECODE)。

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

  • 我检查了CLOB,找不到换行符\ n,也找不到任何空格(仅找到+号)。此外,我将CLOB值插入到base64-image-converter中,它可以正确显示图像。另外,我尝试将生成的BLOB编码回base64,以便进一步验证(使用上面链接中提供的相反功能),生成的base64根本不一样。

     开始
      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');
      -...设置标题的属性
      UTL_HTTP.set_header(l_http_request,'X-Appery-Database-Id','53f2dac5e4b02cca64021dbe');
      l_http_response:= UTL_HTTP.get_response(l_http_request);
      开始
        环形
          UTL_HTTP.read_text(l_http_response,buf);
          l_response_text:= l_response_text || buf;
        结束循环;
      例外
      当UTL_HTTP.end_of_body然后
        空值;
      结尾;
      l_list:= json_list(l_response_text);
      在1..l_list.count中
      环形
        A_id:= json_ext.get_string(json(l_list.get(i)),'_ id');
        l_val:= json_ext.get_json_value(json(l_list.get(i)),'照片');
        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(照片);
        A_Name:= json_ext.get_string(json(l_list.get(i)),'名称');
        备注:= json_ext.get_string(json(l_list.get(i)),'备注');
        状态:= 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');
      插入
        INTO Appery_照片
            援助,
            照片,
            DecodedPhoto,
            一个名字,
            评论,
            状态,
            用户身份,
            一个约会,
            A_Time,
            MSG_status,
            Oracle_Flag,
           ACL
          价值
            援助,
            照片,
            blob原始的,
            一个名字,
            评论,
            状态,
            用户身份,
            一个约会,
            A_Time,
            MSG_status,
            Oracle_Flag,
            ACL
          );
        dbms_lob.freetemporary(照片);
      结束循环;
      -完成
      UTL_HTTP.end_response(l_http_response);
    例外
    当UTL_HTTP.end_of_body然后
      UTL_HTTP.end_response(l_http_response);
    结尾;

任何帮助深表感谢。

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

数据:image / jpeg; base64,/ 9j / 4AAQSkZJRgABAQAAA

所以我必须使用类似这样的东西:clobbase642blob(substr(Photo,instr(Photo,',')+ 1))

下面的脚本的灵感来自甲骨文社区答案

宣布
  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);
  相片CLOB;
  A_Name VARCHAR2(100);
  备注VARCHAR2(100);
  状态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;
  子字符串VARCHAR2(2000);
  tmp BLOB;
  n pls_integer:= 0;
  substring_length pls_integer:= 2000;
  -------------------------------------------------- -
  功能clobbase642blob(
      p_clob CLOB)
    返回BLOB
    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);
  开始
    dbms_lob.createtemporary(t_blob,true);
    t_len:= LENGTH(p_clob);
    环形
      出口
    当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;
      当t_pos 0
      环形
        t_buffer:= t_buffer || REPLACE(REPLACE(SUBSTR(p_clob,t_pos,1),chr(10)),chr(13));
        t_pos:= t_pos + 1;
      结束循环;
      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);
    结束循环;
    返回t_blob;
  结尾;
  -------------------------------------------------- -
  开始
    -服务的输入参数
    -准备要求...
    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');
    -...设置标题的属性
    UTL_HTTP.set_header(l_http_request,'X-Appery-Database-Id','53f2dac5e4b02cca64021dbe');
    l_http_response:= UTL_HTTP.get_response(l_http_request);
    开始
      环形
        UTL_HTTP.read_text(l_http_response,buf);
        l_response_text:= l_response_text || buf;
      结束循环;
    例外
    当UTL_HTTP.end_of_body然后
      空值;
    结尾;
    l_list:= json_list(l_response_text);
    在1..l_list.count中
    环形
      A_id:= json_ext.get_string(json(l_list.get(i)),'_ id');
      -使用base64 URI照片处理> 32KB
      l_val:= json_ext.get_json_value(json(l_list.get(i)),'照片');
      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(照片,20,1));
      blobOriginal:= clobbase642blob(SUBSTR(Photo,24));
      A_Name:= json_ext.get_string(json(l_list.get(i)),'名称');
      备注:= json_ext.get_string(json(l_list.get(i)),'备注');
      状态:= 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');
      插入
      INTO Appery_照片
          援助,
          照片,
          DecodedPhoto,
          一个名字,
          评论,
          状态,
          用户身份,
          一个约会,
          A_Time,
          MSG_status,
          Oracle_Flag,
          ACL
        价值
          援助,
          照片,
          blob原始的,
          一个名字,
          评论,
          状态,
          用户身份,
          一个约会,
          A_Time,
          MSG_status,
          Oracle_Flag,
          ACL
        );
      dbms_lob.freetemporary(照片);
    结束循环;
    -完成
    UTL_HTTP.end_response(l_http_response);
  例外
  当UTL_HTTP.end_of_body然后
    UTL_HTTP.end_response(l_http_response);
  结尾;
  /

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用JavaScript将data:image / png:base64 ...解码为真实图像

使用循环解码base64图像

将base64图像字符串编码为JSON,然后使用jq将其解码回

如何使用Ansible模块将Base64 var解码为二进制文件

使用javascript将Base64解码为十六进制字符串

如何使用GWT将短字符串编码/解码为Base64?

使用 jackson 和 spring-boot 将 base64 编码的 JSON 解码为 POJO

如何使用Ionic 3将.html文件中的数据从api解码为base64

使用 for 循环将 base64 字符串列表解码为 png 图像只是创建一个文件(python3)

使用angularjs将SVG中的xlink:href设置为base64编码的图像

InvalidCharacterError:字符串包含无效字符,同时使用atob()将base64解码为字节

将 numpy.array 编码和解码为 base64。为什么需要使用 numpy.frombuffer?

将base64正确解码为Blob吗?

使用base64在Ruby中解码

将图像从base64解码为jpg

将base64数据解码为图像

如何使用SQL将Blob数据编码为base 64?

无法使用java将图像转换为base64

使用Java将图像转换为base64

使用pyfpdf将Base64图像插入pdf

如何在命令行中使用base64解码图像字符串?

如何使用base64解码编码的图像字符串

在Javascript中将特殊字符编码为Base64,并在PHP中使用base64_decode()进行解码

Oracle-使用PL / SQL更新BLOB

PL/SQL 中的“被使用”查询?

在PL / SQL中使用LIKE

在PL / SQL中使用变量

使用while的PL / SQL循环

使用外部联接的PL / SQL