附件分块上传原创
金蝶云社区-BobbyLIU
BobbyLIU
82人赞赏了该文章 188次浏览 未经作者许可,禁止转载编辑于2024年07月02日 17:47:18

大的附件(如大于4M),一定要分块儿上传。分块儿上传方式为将读取到的附件字节流拆分成多个块,分别转Base64以后,按顺序分别调用上传接口。 第一次调用时候成功时候会返回调用成功的FFileID,后续分块调用时候请求消息里需要携带这个FFileID以标识多次调用为同一个文件。 分块上传非最后一个分块调用接口时候需要将IsLast参数设置为fasle,最后一个分块上传时候需要将IsLast参数设置为true


附件分块上传,最后一块时设置isLast为true,但实际结果只有最后一块有上传成功(因缺失无法打开),前面上传的都缺失了(比如4.36M的附件,每次按1M分块上传,最后只有0.36M上传了),这是什么原因

File file = new File(filePath);

FileInputStream fileInputStream = new FileInputStream(file);

int maxChunkSize = 1024 * 1024; // 定义每次转换的最大块大小,例如1M

byte[] chunk = new byte[maxChunkSize];

//StringBuilder base64String = new StringBuilder();

int bytesRead;

String fileId = "";

boolean isLast = false; // 初始化isLast标志位


while ((bytesRead = fileInputStream.read(chunk)) != -1) {

     // 判断是否为最后一块

     isLast = bytesRead < maxChunkSize;

    

     byte[] subArray = new byte[bytesRead];

     System.arraycopy(chunk, 0, subArray, 0, bytesRead);

    

     // 将字节转换为Base64编码

     String encodedString = Base64.getEncoder().encodeToString(subArray);

    

     JSONObject job = new JSONObject(new LinkedHashMap());

     job.put("FileName", fileName);

     job.put("FEntryKey", "");

     //job.put("FormId", "SCP_PurchaseOrder");

     job.put("FormId", "PUR_PurchaseOrder");

     job.put("IsLast", true);

     job.put("InterId", InterId);

     job.put("BillNO", fBillNo);

     job.put("AliasFileName", fileName);

     job.put("FFileId", fileId);

     job.put("SendByte", encodedString);

     String resultJson = api.attachmentUpload(job.toString());

     JSONObject job1 = JSONObject.parseObject(resultJson);

     job1 = JSONObject.parseObject(job1.getString("Result").toString());

     fileId = job1.getString("FileId");

    

     repoRet = gson.fromJson(resultJson, RepoRet.class);

     if (repoRet.getResult().getResponseStatus().isIsSuccess()) {

          System.out.printf("附件上传ERP服务器返回结果: %s%n", gson.toJson(repoRet.getResult()));

     } else {

          fail("附件上传ERP服务器返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));

         jsonobj.put("status", "error") ;

         jsonobj.put("message", "附件上传ERP失败") ;

         break;

     }

     // 如果是最后一块,则跳出循环

     if (isLast) {

          break;

     }

}

fileInputStream.close();


赞 82