2015-02-01 9 views
0

자동화 된 전자 메일을 생성하는 Oracle Apex 애플리케이션이 있습니다. Apex에서 사용자는 서식있는 텍스트 필드에 JPG 이미지를 삽입합니다. 그 이미지는 CLOB 필드에 저장됩니다. 저장 프로 시저가 호출되면 JPG 이미지를 읽고이를 l_image_clob라는 로컬 변수에 저장합니다. 프로그램은 임베디드 이미지 (참고 : 임베디드 이미지이며 이메일 첨부 파일이 아님)와 나머지 이메일 본문을 사용자 목록에 보냅니다. 그게 다 잘되고있어.
이제 l_image_clob에 저장된 JPG 이미지의 내용을 Windows 서버의 JPG 파일에 저장하려고합니다. 다음 코드는 제대로 명명 된 파일을 생성하고 크기는 정확하지만 시스템에서 읽을 수는 없습니다. Microsoft Paint로 열려고하면 "이것은 유효한 비트 맵 파일이 아닙니다"라는 오류 메시지가 나타납니다. 어떻게 utl_file을 사용합니까?오라클 utl_file을 사용하여 이미지 clob을 작성하는 방법

Here's the code which creates the file that is "not a valid bitmap file" 
     -- Create a file based on the content of l_image_clob 
     l_image_filename := 'image_' || p_event_pkey || '_' || i || 
     '.' || l_image_ext; 
     l_file_handle := utl_file.fopen(l_dirname , l_image_filename, 'wb'); 
     -- wb is write byte. This returns file handle 
     <<inner_loop>> 
     for i in 1 .. ceil(length(l_image_clob)/chnksz) 
     loop 
     utl_file.put_raw(l_file_handle, 
      utl_raw.cast_to_raw(substr(l_image_clob, (i-1) * chnksz + 1, chnksz))); 
     utl_file.fflush(l_file_handle); 
     end loop inner_loop; 
     utl_file.fclose(l_file_handle); 

감사합니다.

답변

0

답변을 찾았습니다. Apex로 시작된 이미지는 base64로 인코딩되었습니다. 그러므로 나는 디코드해야만했다. 누군가이 일을하는 절차를 도와 줬어. 내 수정 된 코드는 이제 다음과 같습니다

-- Create a file based on the content of l_image_clob 
l_image_filename := 'image_' || p_event_pkey || '_' || i || 
'.' || l_image_ext; 
clob_base64_to_file(l_image_clob, l_dirname, l_image_filename); 

다음과 같이라고하는 절차는 다음과 같습니다

create or replace procedure clob_base64_to_file( 
    p_clob  in clob, 
    p_dir   in varchar2, 
    p_filename in varchar2 
) 
is 
    t_buffer   varchar2(32767); 
    t_pos    number := 1; 
    t_len    number; 
    t_fh    utl_file.file_type; 
    t_size   number := nls_charset_decl_len(32764, 
        nls_charset_id('char_cs')); 
begin 
    t_fh := utl_file.fopen(p_dir, p_filename, 'wb', 32767); 
    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 <= t_len and mod(length(t_buffer), 4) > 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; 
    utl_file.put_raw(t_fh, 
     utl_encode.base64_decode(utl_raw.cast_to_raw(t_buffer))); 
    end loop; 
    utl_file.fclose(t_fh); 
end; 

나는 clob_base64_to_file 절차는 디렉토리와 파일 이름에 따라 파일을 이미지를 디코딩하고 생성 호출 할 때 나는 전화를했다.