簡體   English   中英

在 PL/SQL apex_web_service.make_rest_request 中使用 p_parm_values 上傳一個 blob

[英]Upload a blob using p_parm_values in PL/SQL apex_web_service.make_rest_request

我正在嘗試使用 Apex(雲)運行 PL/SQL 腳本,該腳本從表中獲取 BLOB object 並通過 POST API 調用將其發送到 Alfresco 服務器。

如果我使用 Postman/Insomnia 撥打 API 電話,我會執行以下操作:

  1. 將 Content-Type 設置為“multipart/form-data”
  2. 在正文中添加一個名為“filedata”的鍵
  3. 對於它的價值,我會 select 來自本地文件系統的文件

在此處輸入圖像描述

我會將其作為帶有基本身份驗證的 POST 請求發送。

我在使用 PL/SQL 和 APEX_WEB_SERVICE 模塊復制它時遇到問題。 下面是我正在嘗試的代碼:

DECLARE
    f_attachment BLOB;
    f_response CLOB;
    v_login VARCHAR2(100);
    v_password VARCHAR2(100);
    l_offset     INT := 1;
    p_clob CLOB;
BEGIN
    v_login := '***';
    v_password := '***';
    
    
    
    SELECT PDF INTO f_attachment FROM VIPUL_TEST WHERE ID=2;
    
    
    apex_web_service.g_request_headers.delete;
    apex_web_service.g_request_headers(1).name := 'Content-Type';
    apex_web_service.g_request_headers(1).value := 'multipart/form-data';
    
    f_response := apex_web_service.make_rest_request(p_url => 'https://systest.eisenvault.net/alfresco/api/-default-/public/alfresco/versions/1/nodes/2b9d7fc9-a12e-4e0b-89b2-e556ddfd2778/children',  
                                                     p_http_method => 'POST',
                                                     p_username => v_login,
                                                     p_password => v_password,
                                                     p_parm_name => apex_util.string_to_table('filedata'),
                                                     p_parm_value => apex_util.string_to_table(apex_web_service.blob2clobbase64(f_attachment))

    );
    
    

    -- Print out the CLOB fetched from Database
    p_clob := apex_web_service.blob2clobbase64(f_attachment);

    dbms_output.put_line('Print CLOB');    
    loop  
        exit when l_offset > dbms_lob.getlength(p_clob);  
        dbms_output.put_line( dbms_lob.substr( p_clob, 255, l_offset ) );  
        l_offset := l_offset + 255;  
    end loop; 
    -- Finish Printing
END;

我收到以下錯誤:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 21
ORA-06512: at "SYS.DBMS_SQL", line 1721


1. DECLARE
2.  f_attachment BLOB;
3.  f_response CLOB;
4.  v_login VARCHAR2(100);

clob 似乎不能作為 p_parm_value 中的值傳遞。 你能建議一種方法來完成這項工作嗎? 有沒有辦法將 Blob 或 Clob 轉換為字符串? 我不願意將其轉換為 varchar 類型,因為它的上限為 32kb(對嗎?),而這些附件的大小可能為數 GB。

我們自己解決了這個問題。 下面是有效的代碼。

DECLARE
    l_clob clob;    
    l_json clob;
    lb_blob blob;
    l_body clob;
    lv_filename      VARCHAR2(20)  := 'my_file.pdf';
    lm_multipart     apex_web_service.t_multipart_parts;

BEGIN
    SELECT PDF
      INTO lb_blob
      FROM VIPUL_TEST WHERE ID = 3;

  apex_web_service.APPEND_TO_MULTIPART (
                p_multipart    => lm_multipart,
                p_name         => 'filedata',
                p_filename     => lv_filename,
                p_content_type => 'application/octet-stream',
                p_body_blob    => lb_blob );


 l_clob := apex_web_service.make_rest_request(
              p_url => 'https://systest.eisenvault.net/alfresco/api/-default-/public/alfresco/versions/1/nodes/2b9d7fc9-a12e-4e0b-89b2-e556ddfd2778/children',
              p_username => '***',
              p_password => '***',
              p_http_method => 'POST',
              p_body_blob => apex_web_service.generate_request_body(lm_multipart));
              

    dbms_output.put_line(to_char(l_clob));
END;
/

您應該嘗試通過 APEX_WEB_SERVICE.MAKE_REST_REQUEST function 的以下參數發送它:

p_body_blob IN BLOB default empty_blob()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM