PS下载第三方系统附件

文章介绍了在PS开发中与第三方系统进行文件传输的需求,如生成并发送员工离职证明。对比了以往使用第三方Jar包和Base64编码的优缺点,并提出新的实现方式——使用原生Java类进行文件下载,以避免Jar包冲突和服务器权限问题。文中提供了核心代码示例,展示如何通过HttpURLConnection下载文件到服务器并返回文件路径。
摘要由CSDN通过智能技术生成

一、需求背景

       在PS开发中经常需要与第三方系统进行文件传输,例如在某项目中,员工离职需要根据模板生成员工离职证明,然后将离职证明发送到第三方系统进行盖章,第三方系统会返回盖完章后的离职证明地址,PS需要将盖章后的离职证明保存一份到PS系统。

二、解决方案

以前PS实现文件下载有以下种方式:

实现方式

优点

缺点

第三方Jar包

这种方式实现比较简单,大部分代码在Java端写,PS只需要调用Jar包提供的方法即可。

PS没有良好的Jar包管理工具,经常会导致相同的Jar包反复上传。其次需要服务器权限,有些申请服务器权限很麻烦。

传输Base64

PS可以借助IB来实现,不需要使用到Java。

Base64有体积膨胀的问题,例如一个1M的文件经过Base64编译后会变成1.3M左右。

现在新增了两种实现方式:

实现方式

优点

缺点

原生Java类

不需要服务器权限,使用原生Java类实现,不用担心Jar包冲突问题。

尚未经过大量测试。

配置MTOM传输

官方推荐的方式,我没有配置成功,不过多评价

Sending and Receiving Binary Data (oracle.com)

三、实现方式

这次是采用原生Java类的方式去实现的。

核心代码:

/*==========================================================

  函数名  : getAttachmentFromOtherSystem

  说明    : 从第三方系统下载附件 

  输入参数: &url                    附件资源路径            

                  &headers           请求头参数                                 

  输出参数: 文件在服务器中的绝对路径

  ----------------------------------------------------------

  日期        作者                BUG编号                修改历史

  2023/01/31  kqs                                                       创建

===========================================================*/

Function getAttachmentFromOtherSystem(&url As string, &headers As JsonObject) Returns string

   Local string &dirPath = "/tmp/files/";

   If Not FileExists(&dirPath, %FilePath_Absolute) Then

      CreateDirectory(&dirPath, %FilePath_Absolute);

   End-If;

   Local string &fileName = UuidGen();

   Local string &filePath = &dirPath | &fileName;

  

   /* start--连接资源 */

   Local JavaObject &url1 = CreateJavaObject("java.net.URL", &url);

   Local JavaObject &connection = GetJavaClass("java.net.HttpURLConnection");

   &connection = &url1.openConnection();

   rem 配置请求头;

   For &i = 1 To &headers.ChildCount

      Local string &key = &headers.GetPropertyNameAt(&i);

      Local string &value = &headers.GetProperty(&key);

      &connection.setRequestProperty(&key, &value);

   End-For;

   /* end--连接资源 */

   /*

   &connection.setRequestProperty("Host", "localhost");

   &connection.setRequestProperty("x-qys-accesstoken", "UEaiJwzIHg");

   &connection.setRequestProperty("x-qys-signature", "53d912fd5561eac3ecb54cda88c86628");

   &connection.setRequestProperty("x-qys-timestamp", "0");

   */

   rem &connection.setRequestMethod("GET");

   rem &connection.connect();

   rem &r = CreateJavaObject("java.io.BufferedReader", CreateJavaObject("java.io.InputStreamReader", &connection.getInputStream()));

   rem &line = &r.readLine();

   /* start--获取文件后缀名 */

   Local string &contStr = &connection.getHeaderField("Content-Disposition");

   Local number &post = Find(".", &contStr);

   Local string &extFileName = Substring(&contStr, &post, Len(&contStr) + 1 - &post);

   &filePath = &filePath | &extFileName;

   /* end--获取文件后缀名 */

   /*

   Local JavaObject &file = CreateJavaObject("java.io.File", &filePath);

   Local JavaObject &FileUtils = GetJavaClass("org.apache.commons.io.FileUtils");

   &FileUtils.copyInputStreamToFile(&connection.getInputStream(), &file);

   */

   /* start--将文件写入服务器 */

   Local JavaObject &fileOutputStream = CreateJavaObject("java.io.FileOutputStream", &filePath);

   Local JavaObject &buffer = CreateJavaArray("byte[]", 8192);

   Local number &n = 0;

   While &n <> - 1

      &n = &connection.getInputStream().read(&buffer);

      If &n <> - 1 Then

         &fileOutputStream.write(&buffer, 0, &n);

      End-If;

   End-While;

   /* end--将文件写入服务器 */

   Return &filePath;

End-Function;

四、效果

调用该方法后会将第三方系统的文件下载到服务器的临时目录,并返回文件绝对路径,后续的文件保存交给开发者。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值