大的附件(如大于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();