PL/SQL调用REST API上传附件

2024-08-27 16:52

本文主要是介绍PL/SQL调用REST API上传附件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PL/SQL调用REST API上传附件

  • 概述
    • 代码示例
    • 说明

概述

本文主要介绍如何用PL/SQL程序调用REST API上传附件。初始代码源自github, 经过修改测试。

代码示例

  TYPE part IS RECORD(ds_header VARCHAR2(2048),ds_value  VARCHAR2(1024),ds_blob   BFILE);TYPE parts IS TABLE OF part;
v_boundary CONSTANT VARCHAR2(60) := '---------------------------30837156019033';
v_end      CONSTANT VARCHAR2(10) := '--';//准备http请求里包含的内容,封装在p_parts参数中PROCEDURE add_file(p_parts        IN OUT parts,p_name         IN VARCHAR2,p_filename     VARCHAR2,p_content_type VARCHAR2,p_blob         BFILE) ASv_part part;BEGIN//p_name: 'file'; p_filename:文件名;v_newline: 0D0A; p_content_typ:application/pdfv_part.ds_header := 'Content-Disposition: form-data; name="' || p_name ||'"; filename="' || p_filename || '"' || v_newline ||'Content-Type: ' || p_content_type || v_newline || v_newline;v_part.ds_blob := p_blob;p_parts.extend();p_parts(p_parts.last) := v_part;END add_file;
//把parts里的内容写入http请求PROCEDURE send(p_req   IN OUT utl_http.req,p_parts IN OUT parts) ASv_length     NUMBER := 0;v_length_bo  NUMBER := length(v_boundary);v_length_nl  NUMBER := length(v_newline);v_length_end NUMBER := length(v_end);v_step  PLS_INTEGER := 12000;v_count PLS_INTEGER := 0;BEGIN-- calculate the content-lengthv_length := v_length + v_length_end + v_length_bo + v_length_nl;FOR i IN p_parts.first .. p_parts.last LOOPv_length := v_length + length(p_parts(i).ds_header);IF (p_parts(i).ds_blob IS NOT NULL) THENv_length := v_length + dbms_lob.getlength(p_parts(i).ds_blob);ELSEv_length := v_length + length(p_parts(i).ds_value);END IF;v_length := v_length + v_length_nl;v_length := v_length + v_length_end + v_length_bo;IF (i != p_parts.last) THENv_length := v_length + v_length_nl;END IF;END LOOP;v_length := v_length + v_length_end + v_length_nl;utl_http.set_header(p_req,'Content-Type','multipart/form-data; boundary=' || v_boundary);utl_http.set_header(p_req,'Content-Length',v_length);//用write_raw才不会有乱码,试了很多次才确定write_raw可以utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_boundary));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));-- write partsFOR i IN p_parts.first .. p_parts.last LOOPutl_http.write_raw(p_req,utl_raw.cast_to_raw(p_parts(i).ds_header));IF (p_parts(i).ds_blob IS NOT NULL) THENdbms_lob.open(p_parts(i).ds_blob,dbms_lob.lob_readonly);v_count := trunc((dbms_lob.getlength(p_parts(i).ds_blob) - 1) / v_step);FOR j IN 0 .. v_count LOOPutl_http.write_raw(p_req,dbms_lob.substr(p_parts(i).ds_blob,v_step,j * v_step + 1));END LOOP;dbms_lob.close(p_parts(i).ds_blob);ELSEutl_http.write_raw(p_req,utl_raw.cast_to_raw(p_parts(i).ds_value));END IF;utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_boundary));IF (i != p_parts.last) THENutl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));END IF;END LOOP;utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));END send;                     

说明

调用add_file和send两个存储过程可以准备好附件上传http请求,其余部分和调用普通REST API代码一样。

这篇关于PL/SQL调用REST API上传附件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112247

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum