springboot通过文件流的方式上传文件到腾讯云cos代码记录 Published on Apr 23, 2022 in 随笔 with 0 comment ## 前言 ### 以下采用文件流的方式上传文件到腾讯云cos `COSConfig` ````java @Data @Component("cosConfig") @ConfigurationProperties(prefix = "cos") public class COSConfig { private String baseUrl; private String secretId; private String secretKey; private String regionName; private String bucketName; private String folderPrefix; } ```` `COSClientUtil` ```java @Slf4j public class COSClientUtil { /** * 获取配置信息 */ private static COSConfig cosConfig = SpringUtilsAuTo.getBean(COSConfig.class); /** * 初始化用户身份信息 */ private static COSCredentials cred = new BasicCOSCredentials(cosConfig.getSecretId(), cosConfig.getSecretKey()); /** * 设置bucket的区域 */ private static ClientConfig clientConfig = new ClientConfig(new Region(cosConfig.getRegionName())); /** * 生成COS客户端 */ private static COSClient cosClient = new COSClient(cred, clientConfig); /** * 上传文件 * * @param file * @return * @throws Exception */ public static String upload(MultipartFile file) throws Exception { String date = DateUtils.formatDate(new Date(), "yyyy-MM-dd"); String originalFilename = file.getOriginalFilename(); String nextId = IdGen.nextId(); String name = nextId + originalFilename.substring(originalFilename.lastIndexOf(".")); String folderName = cosConfig.getFolderPrefix() + "/" + date + "/"; String key = folderName + name; File localFile = null; try { localFile = transferToFile(file); String filePath = uploadFileToCOS(localFile, key); log.info("upload COS successful: {}", filePath); return filePath; } catch (Exception e) { e.printStackTrace(); throw new Exception("文件上传失败"); } finally { localFile.delete(); } } /** * 上传文件 * * @param input * @param metadata * @param fileType * @return * @throws Exception */ public static String inputStreamUpload( InputStream input, ObjectMetadata metadata, String fileType) throws InterruptedException { String date = DateUtils.formatDate(new Date(), "yyyy-MM-dd"); String nextId = IdGen.nextId(); String name = nextId + "." + fileType; String folderName = cosConfig.getFolderPrefix() + "/" + date + "/"; String key = folderName + name; String filePath = inputStreamUploadFileToCOS(key, input, metadata); log.info("upload COS successful: {}", filePath); return filePath; } /** * 上传文件到COS * * @param localFile * @param key * @return */ private static String uploadFileToCOS(File localFile, String key) throws InterruptedException { PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, localFile); ExecutorService threadPool = Executors.newFixedThreadPool(8); // 传入一个threadPool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池 TransferManager transferManager = new TransferManager(cosClient, threadPool); // 返回一个异步结果Upload, 可同步的调用waitForUploadResult等待upload结束, 成功返回UploadResult, 失败抛出异常 Upload upload = transferManager.upload(putObjectRequest); UploadResult uploadResult = upload.waitForUploadResult(); // transferManager.shutdownNow(); // cosClient.shutdown(); String filePath = cosConfig.getBaseUrl() + uploadResult.getKey(); return filePath; } /** * 通过流的方式上传文件到COS * * @param key * @param input * @param metadata * @return * @throws InterruptedException */ private static String inputStreamUploadFileToCOS( String key, InputStream input, ObjectMetadata metadata) throws InterruptedException { PutObjectRequest putObjectRequest = new PutObjectRequest(cosConfig.getBucketName(), key, input, metadata); ExecutorService threadPool = Executors.newFixedThreadPool(8); // 传入一个threadPool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池 TransferManager transferManager = new TransferManager(cosClient, threadPool); // 返回一个异步结果Upload, 可同步的调用waitForUploadResult等待upload结束, 成功返回UploadResult, 失败抛出异常 Upload upload = transferManager.upload(putObjectRequest); UploadResult uploadResult = upload.waitForUploadResult(); // transferManager.shutdownNow(); // cosClient.shutdown(); String filePath = cosConfig.getBaseUrl() + uploadResult.getKey(); return filePath; } public static void delete(String key) { // 指定要删除的 bucket 和对象键 cosClient.deleteObject(cosConfig.getBucketName(), key.replaceAll(cosConfig.getBaseUrl(), "")); } /** * 用缓冲区来实现这个转换, 即创建临时文件 使用 MultipartFile.transferTo() * * @param multipartFile * @return */ private static File transferToFile(MultipartFile multipartFile) throws IOException { String originalFilename = multipartFile.getOriginalFilename(); String prefix = originalFilename.split("\\.")[0]; String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); File file = File.createTempFile(prefix, suffix); multipartFile.transferTo(file); return file; } ``` `使用方法` ```java // 创建上传Object的Metadata ObjectMetadata meta = new ObjectMetadata(); // 必须设置ContentLength meta.setContentLength(Long.valueOf(objectMap.get("contentLength").toString())); String fileType = objectMap.get("contentType").toString(); String filePath = COSClientUtil.inputStreamUpload(inputStreamFromUrl, meta, fileType); ``` `application.yml` ```yaml cos: baseUrl: https://****.myqcloud.com secretId: AKI****vKS****eqlOkpdBS secretKey: 0jBMHv****QQ8ZmjPo regionName: ap-**** bucketName: ****-1253487179 folderPrefix: /files ``` 本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。