Template handler displaying image
This document covers sample implementation for template GET handler displaying uploaded image using a custom upload REST template handlers. Both examples displays uploaded images into the plug-in sample application table UC_FROALA_SAMPLE_BLOBS.
- Simple
- Image checksum
The handler can be combined with handlers uploading an image Simple, Default Parameters and Custom parameters
- must be combined with handler uploading an image Image checksum
- uses access token static function decode to decode an image checksum
- if checksum is missing or malformed returns HTTP status 403 Forbidden
Requirements
Handler displaying uploaded image must meet the following requirements:
- must use GET method
- must be compilable at the run time
- must return 200 HTTP status
- must stream uploaded image content into browser buffer
Handler definition
- Simple
- Image checksum
| Attribute | Value | 
|---|---|
| RESTful Service Module | A custom RESTservice | 
| Module Base Path | /customrest/ | 
| URI Template | display-simple/:fileid | 
| Full URL | https://example-domain.com/ords/workspacename/customrest/display-simple/:fileid | 
| Handler Method | GET | 
| Source Type | PL/SQL | 
| Mime Types Allowed | Not defined | 
| Attribute | Value | 
|---|---|
| RESTful Service Module | A custom RESTservice | 
| Module Base Path | /customrest/ | 
| URI Template | display-checksum/:filename | 
| Full URL | https://example-domain.com/ords/workspacename/customrest/display-checksum/:filename | 
| Handler Method | GET | 
| Source Type | PL/SQL | 
| Mime Types Allowed | Not defined | 
Handler parameters
The upload handler doesn't require registering any resource parameters as long as REST specific bind variable :status_code  is used to set request HTTP status.
Handler Source
The handler displaying uploaded image can be defined as PL/SQL code or media resource.
- Simple
- Image checksum
declare
  v_param_fileid  varchar2(4000) := :fileid;
  v_file_row      UC_FROALA_SAMPLE_BLOBS%ROWTYPE;
begin
  select 
    *
  into
    v_file_row
  from   
    UC_FROALA_SAMPLE_BLOBS   
  where   
    id = to_numbeR(v_param_fileid)
  ;
  sys.HTP.init;  
  sys.OWA_UTIL.mime_header(v_file_row.FILE_MIMETYPE, FALSE);  
  sys.HTP.p('Content-Length: ' || DBMS_LOB.getlength(v_file_row.FILE_CONTENT));  
  sys.HTP.p('Access-Control-Allow-Origin: *');  
  sys.HTP.p('Content-Disposition: filename="' || v_file_row.FILE_NAME || '"');
  sys.OWA_UTIL.http_header_close;  
  sys.WPG_DOCLOAD.download_file(v_file_row.FILE_CONTENT);
  :status_code := 200;
exception
  when no_data_found then
    :status_code := 404;
  when others then
    :status_code := 400;
end;
declare
  v_param_filename    varchar2(4000) := :filename;
  v_param_checksum    varchar2(4000) := :checksum;
  v_checksum_decoded  varchar2(4000);
  v_image_id          number;
  v_file_row          UC_FROALA_SAMPLE_BLOBS%ROWTYPE;
begin
  /* if checksum query parameters is missing force HTTP status 403 */
  //highlight-start
  if v_param_checksum is null then
    raise_application_error(-20001, 'Checksum not included');
  end if;
  //highlight-end
  /* checksum fails decododing when it's malformed */
  //highlight-start
  begin
    v_checksum_decoded := UC_RTE_ACCESS_TOKEN.decode( v_param_checksum ); 
  exception
    when others then
      raise_application_error(-20001, 'Failed decoding checksum');
  end;
  //highlight-end
  
  /* checksum was created using filename and file id separated with coma */
  /* for example "pngaaa.com-4093606.png,29662" */
  //highlight-next-line  
  v_image_id := apex_string.split(v_checksum_decoded, ',')(2);
  select 
    *
  into
    v_file_row
  from   
    UC_FROALA_SAMPLE_BLOBS   
  where   
    id = v_image_id
  ;
  sys.HTP.init;  
  sys.OWA_UTIL.mime_header(v_file_row.FILE_MIMETYPE, FALSE);  
  sys.HTP.p('Content-Length: ' || DBMS_LOB.getlength(v_file_row.FILE_CONTENT));  
  sys.HTP.p('Access-Control-Allow-Origin: *');  
  sys.HTP.p('Content-Disposition: filename="' || v_file_row.FILE_NAME || '"');
  sys.OWA_UTIL.http_header_close;  
  sys.WPG_DOCLOAD.download_file(v_file_row.FILE_CONTENT);
  :status_code := 200;
exception
  when no_data_found then
    :status_code := 404;
  when others then
    if SQLCODE = -20001 then
      //highlight-next-line
      :status_code := 403;
    else
      :status_code := 500;
    end if;
end;
Handler Output
The handler output must be an image content streamed into the browser buffer. It can be done using handler source type media resource or PL/SQL code.
declare
  v_image_mimetype varchar2(4000);
  v_image_filename varchar2(4000);
  v_image_content  blob;
begin
  /* provide image data for declared variables */
  
  sys.HTP.init;  
  sys.OWA_UTIL.mime_header(v_image_mimetype, FALSE);  
  sys.HTP.p('Content-Length: ' || DBMS_LOB.getlength(v_image_content));  
  sys.HTP.p('Access-Control-Allow-Origin: *');  
  sys.HTP.p('Content-Disposition: filename="' || v_image_filename || '"');
  sys.OWA_UTIL.http_header_close;  
  sys.WPG_DOCLOAD.download_file(v_file_row.FILE_CONTENT);
  
  :status_code := 200;
end;