package online.iizvv.utils; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import online.iizvv.core.config.Config; import org.springframework.stereotype.Component; import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @author :iizvv * @date :Created in 2019-07-24 10:24 * @description:TODO * @version: 1.0 */ @Component public class FileManager { /** * create by: iizvv * description: 上传临时文件 * create time: 2019-07-24 10:32 * @return */ public void uploadFile(File file, String objName) { uploadFile(file, objName, true); } public void uploadFile(byte[] bytes, String objName) { uploadFile(bytes, objName, true); } /** * create by: iizvv * description: 上传文件 * create time: 2019-07-24 10:27 * @return */ public void uploadFile(File file, String objName, Boolean isTemp) { String bucket = isTemp==true?Config.aliTempBucket:Config.aliMainBucket; OSS ossClient = new OSSClientBuilder().build(Config.vpcEndpoint, Config.accessKeyID, Config.accessKeySecret); InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucket, objName); InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request); String uploadId = result.getUploadId(); List<PartETag> partETags = new ArrayList<PartETag>(); final long partSize = 4 * 1024 * 1024L; long fileLength = file.length(); int partCount = (int) (fileLength / partSize); if (fileLength % partSize != 0) { partCount++; } for (int i = 0; i < partCount; i++) { long startPos = i * partSize; long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize; InputStream instream = null; try { instream = new FileInputStream(file); // 跳过已经上传的分片。 instream.skip(startPos); UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(bucket); uploadPartRequest.setKey(objName); uploadPartRequest.setUploadId(uploadId); uploadPartRequest.setInputStream(instream); // 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100KB。 uploadPartRequest.setPartSize(curPartSize); // 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出这个范围,OSS将返回InvalidArgument的错误码。 uploadPartRequest.setPartNumber( i + 1); // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。 UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest); // 每次上传分片之后,OSS的返回结果会包含一个PartETag。PartETag将被保存到partETags中。 partETags.add(uploadPartResult.getPartETag()); } catch (IOException e) { e.printStackTrace(); } } Collections.sort(partETags, new Comparator<PartETag>() { public int compare(PartETag p1, PartETag p2) { return p1.getPartNumber() - p2.getPartNumber(); } }); CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucket, objName, uploadId, partETags); ossClient.completeMultipartUpload(completeMultipartUploadRequest); ossClient.shutdown(); } /** * create by: iizvv * description: 字节数组方式上传文件 * create time: 2019-07-24 11:14 * @return void */ public void uploadFile(byte[] bytes, String objName, Boolean isTemp) { String bucket = isTemp==true?Config.aliTempBucket:Config.aliMainBucket; OSS ossClient = new OSSClientBuilder().build(Config.vpcEndpoint, Config.accessKeyID, Config.accessKeySecret); ossClient.putObject(bucket, objName, new ByteArrayInputStream(bytes)); ossClient.shutdown(); } /** * create by: iizvv * description: 获取文件后缀名 * create time: 2019-07-24 10:53 * @return 后缀名 */ public String getSuffixName(File file) { String fileName = file.getName(); String suffix = fileName.substring(fileName.lastIndexOf(".") + 1); return suffix; } }