一、准备jar包
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!-- /artifact/com.aliyun.oss/aliyun-sdk-oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.0</version></dependency>
二、controller层
/*** 上传* @param file* @return* @throws IOException* @throws InterruptedException*/@PostMapping("/aliyun/upload")public String aliyunUpload(MultipartFile file) throws IOException, InterruptedException {AliyunOSS aliyunOSS = new AliyunOSS();String fileName = DateUtil.currentSeconds() + file.getOriginalFilename();String result = aliyunOSS.upLoadFile("zhong", fileName, file.getInputStream());//todo 批量上传的时候容易出现问题,最好是控制一下时间Thread.sleep(1000);return result;}/*** 删除* @param fileUrl* @return*/@PostMapping("/aliyun/upload/delete")public Boolean aliyunUploadDetele(String fileUrl) {boolean flag = AliyunOSS.deleteFile(fileUrl);return flag;}
三、上传类和方法
@Componentpublic class AliyunOSS {private static final String endpoint = "http://oss-cn-/";//endpoint 地址private static final String accessKeyId = "AccessKey ID";//AccessKey IDprivate static final String accessKeySecret = "AccessKey Secret";//AccessKey Secretprivate static final String bucketName = "Bucket名称";//Bucket名称private static final String uploadFile = "test/";//上传文件夹名称private static final String imageBaseUrl = "https://huiphoto.oss-cn-/";//域名地址protected ThreadPoolExecutor executor;/*** 上传文件到阿里云** @param fileName 文件名,前面不用加/线* @param inputStream* @return*/public String upLoadFile(String module, String fileName, InputStream inputStream) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);StrBuilder builder = StrBuilder.create();//新文件名String newFilePath = builder.append(uploadFile).append(module).append("/").append(DateUtil.format(new Date(), "yyyy/MM/dd")).append("/").append(fileName).toString();int processors = Runtime.getRuntime().availableProcessors();executor = new ThreadPoolExecutor(processors * 5, processors * 10, 60L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(processors * 100), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}String finalNewFilePath = newFilePath;FutureTask<String> future = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() {try {//内容准备InputStream stream = inputStream;ossClient.putObject(bucketName, finalNewFilePath, stream);} catch (OSSException oe) {oe.printStackTrace();} catch (Throwable e) {e.printStackTrace();} finally {ossClient.shutdown();}return "";}});executor.execute(future);//关闭线程池if (!executor.isShutdown()) {executor.shutdown();}return imageBaseUrl + finalNewFilePath;}public static boolean deleteFile(String filePath) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);String aliPath = filePath.replace(imageBaseUrl, "");boolean exist = ossClient.doesObjectExist(bucketName, aliPath);if (!exist) {return false;}ossClient.deleteObject(bucketName, aliPath);ossClient.shutdown();return true;}}
四、参数讲解
endpoint(地域节点)和imageBaseUrl(bucket域名):可以在阿里云上获取这两个参数内容
打开阿里云->进入对象存储->点击你创建的bucket->概览
accessKeyId和accessKeySecret:这两个参数就是AccessKey ID和AccessKey Secret
bucketName:阿里云上bucket的名称
uploadFile:文件夹地址,如果没有会自动创建
五、结果
利用postman调用