package com.fr.plugin.file.submit.oss.fun; import com.aliyun.oss.OSSClient; import com.fr.cache.Attachment; import com.fr.general.FArray; import com.fr.general.GeneralUtils; import com.fr.locale.InterProviderFactory; import com.fr.script.Calculator; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.FRFile; import java.io.ByteArrayInputStream; public class OssUpload { public static void upload(Calculator calculator, OSSClient ossClient, OssSubmitTargetConfig submitTargetConfig) throws Exception { OssSubmitTarget[] submitTargets = submitTargetConfig.getSubmitTargets(); for (OssSubmitTarget target : submitTargets) { OssVariableValue fileObject = target.getFile(); String filePath = GeneralUtils.objectToString(fileObject); Object file = calculator.evalValue(filePath); uploadFile(ossClient, target.getBucket(), file, target.getDirectory() == null ? null : target.getDirectory().getResult(calculator), target.getName() == null ? null : target.getName().getResult(calculator)); } } private static void uploadFile( OSSClient ossClient, String bucket, Object file, String directory, String newFileName) { if (file instanceof FRFile) { uploadSingleFile(ossClient, bucket, directory, combineName(((FRFile) file).getFileName(), newFileName), ((FRFile) file).getBytes()); } else if (file instanceof FArray && ((FArray) file).length() != 0) { FArray array = (FArray)file; for (int i = 0; i < array.length(); i++) { Object element = array.elementAt(i); if (!(element instanceof Attachment)) { if (element instanceof FArray) { uploadFile(ossClient, bucket, element, directory, newFileName); } } else { uploadSingleFile(ossClient, bucket, directory, combineName(((Attachment) element).getFilename(), newFileName), ((Attachment) element).getBytes()); } } } } private static void uploadSingleFile(OSSClient ossClient, String bucket, String directory, String newFileName, byte[] bytes) { if (ArrayUtils.isEmpty(bytes)) { throw new RuntimeException(InterProviderFactory.getProvider().getLocText("Plugin-File_Submit_Oss_Failed", newFileName)); } ossClient.putObject(bucket, directory + "/" + newFileName, new ByteArrayInputStream(bytes)); } /* * 这里的逻辑是: * 1、如果没有设置文件名,就用上传的文件的名字; * 2、如果设置了文件名,且带有文件后缀,就用设置的文件名; * 3、其他情况都用原文件名。 */ private static String combineName(String fileName, String myFileName) { String realFileName; if (StringUtils.isBlank(fileName)) { fileName = "unnamed.png"; } if (StringUtils.isNotEmpty(myFileName)) { int index = myFileName.lastIndexOf("."); if (index == -1) { realFileName = fileName; } else { realFileName = myFileName; } } else { realFileName = fileName; } return realFileName; } }