我使用下面的脚本从MongoDB中获取JSON文件,对其进行解析,然后将其插入到Oracle表中。
>
表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;
我们非常感谢您的帮助。
我发现这不是我在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图像吗 至