使用PL / SQL HTTP上传BLOB文件

时间:2015-03-24 06:17:37

标签: http plsql oracle11g

通常,我使用以下结构发送带有varchar2和数字等内容的POST请求。

content := '{"Original File Name":"'||V_HOMEBANNER_1_EN_NAME(indx)||'"}';
  url := 'https://api.appery.io/rest/1/db/Names'; 
  req     := utl_http.begin_request(url, 'POST',' HTTP/1.1');
  UTL_HTTP.set_header(req, 'X-Appery-Database-Id', '5f2dac54b02cc6402dbe');
  utl_http.set_header(req, 'content-type', 'application/json');
  UTL_HTTP.set_header(req, 'X-Appery-Session-Token', sessionToken);
  utl_http.set_header(req, 'Content-Length', LENGTH(content));
  utl_http.write_text(req, content);
  res := utl_http.get_response(req);


BEGIN
  LOOP
    utl_http.read_line(res, buffer);
 END LOOP;
 utl_http.end_response(res);
EXCEPTION
WHEN utl_http.end_of_body THEN
  utl_http.end_response(res);
END;

它运作得很好。但是,现在我想将一个blob文件(jpg图像)发送/上传到一些叫做“文件”的MongoDB集合中。 (所以url:= ttps://api.appery.io/rest/1/db/Files)。收集指南包含以下cURL作为一般建议:

curl -X POST \
  -H "X-Appery-Database-Id: 5f2dac54b02cc6402dbe" \
  -H "X-Appery-Session-Token: <session_token>" \
  -H "Content-Type: <content_type>" \
  --data-binary '<file_content>' \
  https://api.appery.io/rest/1/db/files/<file_name>

但我无法将此cURL转换为PL / SQL请求。具体来说,部分(--data-binary&#39;&#39;)

我在Oracle表中有这些BLOB文件,它们的名称存储如下:

+-----------+--------------+
| File_Name | File_content |
+-----------+--------------+
| PIC_1.jpg | BLOB         |
| PIC_2.jpg | BLOB         |
| PIC_3.jpg | BLOB         |
+-----------+--------------+

我的问题是,如何将这些图片上传到目标网址?

1 个答案:

答案 0 :(得分:3)

受@JeffreyKemp建议的blog的启发,我只是将write_text()替换为write_raw(),以便将内容正文作为BLOB发送(由API请求)。

以下代码是我的函数的关键部分,需要进行更改:

  content :=  V_HOMEBANNER_1_EN(indx);
  file_name := 'test.jpg';
  url  := 'https://api.appery.io/rest/1/db/files/'||file_name;      
  req     := utl_http.begin_request(url, 'POST',' HTTP/1.1');
  UTL_HTTP.set_header(req, 'X-Appery-Database-Id', '53fae4b02cc4021dbe');
  UTL_HTTP.set_header(req, 'X-Appery-Session-Token', sessionToken);
  utl_http.set_header(req, 'content-type', 'image/jpeg');
  req_length := DBMS_LOB.getlength(CONTENT);
  DBMS_OUTPUT.PUT_LINE(req_length);


  --IF MSG DATA UNDER 32KB LIMIT:
  IF req_length <= 32767
  THEN 
  begin
  utl_http.set_header(req, 'Content-Length', req_length);
  utl_http.write_raw(req, content);
  exception
  when others then
  DBMS_OUTPUT.PUT_LINE(sqlerrm);
  end;

  --IF MSG DATA MORE THAN 32KB
  ELSIF req_length >32767
  THEN
  BEGIN
  DBMS_OUTPUT.PUT_LINE(req_length);
  utl_http.set_header(req, 'Transfer-Encoding', 'Chunked');
  WHILE (offset < req_length)
  LOOP
  DBMS_LOB.read(content, amount, offset, buffer);
  utl_http.write_raw(req, buffer);
  offset := offset + amount;
  END LOOP;
  exception
  when others then
  DBMS_OUTPUT.PUT_LINE(sqlerrm);
  end;


  END IF;

  l_http_response := UTL_HTTP.get_response(req);
  UTL_HTTP.read_text(l_http_response, response_body, 32767);
  UTL_HTTP.end_response(l_http_response);

尝试并测试大于和小于32KB的图像/ jpg。