我正在使用以下函數將大型base64編碼文件(圖像或語音)轉換爲blob文件並將其存儲在Oracle數據庫中(Oracle Database 11g企業版版本11.1.0.7。 0 - 生產)。將base 64解碼爲blob時出錯
我能夠存儲它並檢索它,但圖像被損壞。只有圖像的藥水正在被檢索。我試圖使用小圖像(11KB大小),它工作正常。但對於較大的圖像(從88KB到700KB),只能檢索圖像的一部分。
問題在於base-64解碼。早些時候,由於腐敗問題,我無法獲得更小的圖像,但是當我增加了緩衝區大小時,情況良好。現在緩衝區大小最大值爲32767,因爲它是varchar2和raw的最大值。
任何人都可以提供一個合適的解決方法或解決方案。
function decode_base64(p_clob_in in clob) return blob is
v_blob blob;
v_result blob;
v_offset integer;
v_buffer_size binary_integer := 32767; -- 24, 48, 3072
v_buffer_varchar varchar2(32767);
v_buffer_raw raw(32767);
begin
if p_clob_in is null then
return null;
end if;
dbms_lob.createtemporary(v_blob, true);
v_offset := 1;
for i in 1 .. ceil(dbms_lob.getlength(p_clob_in)/v_buffer_size)
loop
dbms_lob.read(p_clob_in, v_buffer_size, v_offset, v_buffer_varchar);
v_buffer_raw := utl_raw.cast_to_raw(v_buffer_varchar);
v_buffer_raw := utl_encode.base64_decode(v_buffer_raw);
dbms_lob.writeappend(v_blob, utl_raw.length(v_buffer_raw), v_buffer_raw);
v_offset := v_offset + v_buffer_size;
end loop;
v_result := v_blob;
dbms_lob.freetemporary(v_blob);
return v_result;
end decode_base64;
,我用它來調用函數,並插入BLOB插入到表下面給出的代碼...
PROCEDURE create_notes (
p_task_id IN NUMBER
,p_note_title IN VARCHAR2
,p_note_detail IN VARCHAR2
,p_attach_name IN VARCHAR2
,p_attachment IN CLOB
,p_attach_type IN VARCHAR2
,x_return_code OUT VARCHAR2
,x_return_message OUT VARCHAR2
)
IS
l_blob_data BLOB;
BEGIN
.
.
.
IF p_attachment IS NOT NULL THEN
SELECT incident_id INTO l_pk1_value FROM csf_ct_tasks where task_id = p_task_id;
l_blob_data := xx_utl_base64.decode_base64(p_attachment);
INSERT INTO fnd_lobs
(file_id, file_name, file_content_type, upload_date,
expiration_date, program_name, program_tag, file_data,
LANGUAGE, oracle_charset, file_format
)
VALUES (l_media_id, p_attach_name,p_attach_type, -- 'audio/mpeg','application/pdf','image/jpeg'
SYSDATE,
NULL, 'FNDATTCH', NULL, l_blob_data, --l_blob_data,EMPTY_BLOB()
'US', 'UTF8', 'binary'
)
RETURNING file_data
INTO x_blob;
COMMIT;
END IF:
附加原始圖片及其解碼版本,以下。
我的代碼的第二圖像無法上傳到SO正確。所以我拍了一張截圖並上傳,因此清晰度有所下降。 – prince
也許問題不在於解碼,而是編碼?你能告訴我們你用來將圖像插入數據庫的代碼嗎? –
Oracle EBS正在進行編碼。它可以完美解碼它。但是當我試圖用代碼做同樣的事情時,問題就來了。 – prince