我正在使用下面的脚本,以便从MongoDB中获取JSON文件,对其进行解析,然后将其插入Oracle表中。
列照片在表Appery_Photos是CLOB类型,而列DecodedPhoto是BLOB类型的。
问题出在blobOriginal := base64decode1(Photo);
我用来将CLOB解码为BLOB的行中。函数base64decode1已被多个函数替换(例如,decode_base64,base64DecodeClobAsBlob_plsql,base64decode,from_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] 删除。
我来说两句