| package com.doumee.core.utils.aliyun; | 
|   | 
| import com.aliyun.oss.ClientException; | 
| import com.aliyun.oss.OSSClient; | 
| import com.aliyun.oss.OSSException; | 
| import com.aliyun.oss.model.*; | 
| import com.doumee.core.utils.FileDigest; | 
| import java.io.File; | 
| import java.io.FileInputStream; | 
| import java.io.FileNotFoundException; | 
| import java.io.IOException; | 
| import java.io.InputStream; | 
| import java.net.URL; | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Map; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.web.multipart.MultipartFile; | 
|   | 
| public class ALiYunUtil { | 
|     private OSSClient client; | 
|   | 
|     // public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com"; | 
|   | 
|     public ALiYunUtil(String endpoint, String ACCESS_ID, String ACCESS_KEY) { | 
|         client = new OSSClient(endpoint, ACCESS_ID, ACCESS_KEY); | 
|     } | 
|   | 
|     /** | 
|      * 上传文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      * @param key        重新命名的文件名 | 
|      * @param filename   将要上传的文件名称 | 
|      * @param mime       超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 | 
|      *                   .rtf application/rtf GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg | 
|      *                   image/jpeg au声音文件 .au audio/basic MIDI音乐文件 mid,.midi | 
|      *                   audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram | 
|      *                   audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi | 
|      *                   video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar | 
|      *                   application/x-tar | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws FileNotFoundException | 
|      */ | 
|   | 
|     public void uploadObject(String bucketName, String key, String filename, | 
|                              String mime) throws OSSException, ClientException, | 
|             FileNotFoundException { | 
|         File file = new File(filename); | 
|         // 判断是否存在,不存在创建 | 
|         isExistBucket(bucketName); | 
|   | 
|         ObjectMetadata objectMeta = new ObjectMetadata(); | 
|         objectMeta.setContentLength(file.length()); | 
|         // 可以在metadata中标记文件类型 | 
|         if (StringUtils.isNotBlank(mime)) { | 
|             objectMeta.setContentType(mime); | 
|         } | 
|   | 
|         InputStream input = new FileInputStream(file); | 
|         client.putObject(bucketName, key, input, objectMeta); | 
|   | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 关闭 | 
|      * | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws FileNotFoundException | 
|      */ | 
|   | 
|     public void shutDown() | 
|             throws OSSException, ClientException, FileNotFoundException { | 
|         if (client != null) { | 
|             // 关闭client | 
|             client.shutdown(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 批量删除文件 | 
|      * | 
|      * @param bucketName | 
|      * @param keys | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws FileNotFoundException | 
|      */ | 
|   | 
|     public void deleteObjects(String bucketName, List<String> keys) | 
|             throws OSSException, ClientException, FileNotFoundException { | 
|         if (keys == null || keys.size() > 0) { | 
|             return; | 
|         } | 
|         DeleteObjectsResult deleteObjectsResult = client | 
|                 .deleteObjects(new DeleteObjectsRequest(bucketName) | 
|                         .withKeys(keys)); | 
|         List<String> deletedObjects = deleteObjectsResult.getDeletedObjects(); | 
|         // 关闭client | 
|         client.shutdown(); | 
|     } | 
|   | 
|     /** | 
|      * 上传文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      *                   将要上传的文件名称 | 
|      * @param mime       超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 | 
|      *                   .rtf application/rtf GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg | 
|      *                   image/jpeg au声音文件 .au audio/basic MIDI音乐文件 mid,.midi | 
|      *                   audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram | 
|      *                   audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi | 
|      *                   video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar | 
|      *                   application/x-tar | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws FileNotFoundException | 
|      */ | 
|   | 
|     public void uploadFiles(String bucketName, Map<String, File> ossFiles, | 
|                             String mime) throws OSSException, ClientException, | 
|             FileNotFoundException { | 
|         // 判断是否存在,不存在创建 | 
|         isExistBucket(bucketName); | 
|   | 
|         // 可以在metadata中标记文件类型 | 
|         if (ossFiles != null && ossFiles.size() > 0) { | 
|             for (Map.Entry<String, File> entry : ossFiles.entrySet()) { | 
|                 ObjectMetadata objectMeta = new ObjectMetadata(); | 
|                 objectMeta.setContentLength(entry.getValue().length()); | 
|                 if (StringUtils.isNotBlank(mime)) { | 
|                     objectMeta.setContentType(mime); | 
|                 } | 
|                 InputStream input = new FileInputStream(entry.getValue()); | 
|                 client.putObject(bucketName, entry.getKey(), input, objectMeta); | 
|                 // 上传图片 | 
|             } | 
|         } | 
|   | 
|         client.shutdown(); | 
|     } | 
|   | 
|     /** | 
|      * 上传文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      * @param key        将要上传的文件名称 | 
|      * @param mime       超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 | 
|      *                   .rtf application/rtf GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg | 
|      *                   image/jpeg au声音文件 .au audio/basic MIDI音乐文件 mid,.midi | 
|      *                   audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram | 
|      *                   audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi | 
|      *                   video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar | 
|      *                   application/x-tar | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws FileNotFoundException | 
|      */ | 
|   | 
|     public boolean uploadFile(String bucketName, String key, File file, String mime) | 
|             throws OSSException, ClientException, FileNotFoundException { | 
|         // 判断是否存在,不存在创建 | 
|         isExistBucket(bucketName); | 
|   | 
|         ObjectMetadata objectMeta = new ObjectMetadata(); | 
|         objectMeta.setContentLength(file.length()); | 
|         // 可以在metadata中标记文件类型 | 
|         if (StringUtils.isNotBlank(mime)) { | 
|             objectMeta.setContentType(mime); | 
|         } | 
|   | 
|         InputStream input = new FileInputStream(file); | 
|         client.putObject(bucketName, key, input, objectMeta); | 
|         return true; | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 上传文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      * @param key        将要上传的文件名称 | 
|      * @param mime       超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 | 
|      *                   .rtf application/rtf GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg | 
|      *                   image/jpeg au声音文件 .au audio/basic MIDI音乐文件 mid,.midi | 
|      *                   audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram | 
|      *                   audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi | 
|      *                   video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar | 
|      *                   application/x-tar | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws IOException | 
|      */ | 
|   | 
|     public boolean uploadObject(MultipartFile file, String bucketName, | 
|                                 String key, String mime) throws OSSException, ClientException, | 
|             IOException { | 
|         if (file != null) { | 
|             // 判断是否存在,不存在创建 | 
|             isExistBucket(bucketName); | 
|   | 
|             ObjectMetadata objectMeta = new ObjectMetadata(); | 
|             objectMeta.setContentLength(file.getSize()); | 
|             // 可以在metadata中标记文件类型 | 
|             if (StringUtils.isNotBlank(mime)) { | 
|                 objectMeta.setContentType(mime); | 
|             } | 
|             PutObjectRequest putObjectRequest = new PutObjectRequest( | 
|                     bucketName, key, file.getInputStream()); | 
|             // 上传回调参数 | 
|             /* | 
|              * Callback callback = new Callback(); | 
|              * callback.setCallbackUrl("http://www.doumee.com"); | 
|              * callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com"); | 
|              * callback.setCallbackBody( | 
|              * "{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}"); // | 
|              * callback.setCallbackBodyType(CallbackBodyType.JSON); | 
|              * callback.addCallbackVar("x:var1", "value1"); | 
|              * callback.addCallbackVar("x:var2", "value2"); | 
|              * putObjectRequest.setCallback(callback); | 
|              */ | 
|             try { | 
|                 PutObjectResult putObjectResult = client | 
|                         .putObject(putObjectRequest); | 
|                 return true; | 
|             } catch (Exception e) { | 
|                 // TODO: handle exception | 
|                 System.err.println(e.getMessage()); | 
|             } | 
|             /* | 
|              * // 读取上传回调返回的消息内容 byte[] buffer = new byte[1024]; | 
|              * putObjectResult.getCallbackResponseBody().read(buffer); | 
|              * | 
|              * // 一定要close,否则会造成连接资源泄漏 | 
|              * putObjectResult.getCallbackResponseBody().close(); | 
|              */ | 
|   | 
|             file.getInputStream().close(); | 
|             client.shutdown(); | 
|   | 
|         } | 
|   | 
|         return false; | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 分块上传文件 | 
|      * | 
|      * @param bucketName | 
|      * @param key | 
|      * @param filename | 
|      * @param mime | 
|      * @throws IOException | 
|      */ | 
|     public String partUploadObject(String bucketName, String key, | 
|                                    String filename, String mime) throws IOException { | 
|         // 开始Multipart Upload | 
|         InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest( | 
|                 bucketName, key); | 
|         InitiateMultipartUploadResult initiateMultipartUploadResult = client | 
|                 .initiateMultipartUpload(initiateMultipartUploadRequest); | 
|   | 
|         // 设置每块为 5M | 
|         final int partSize = 1024 * 1024 * 5; | 
|   | 
|         File partFile = new File(filename); | 
|   | 
|         // 计算分块数目 | 
|         int partCount = (int) (partFile.length() / partSize); | 
|         if (partFile.length() % partSize != 0) { | 
|             partCount++; | 
|         } | 
|   | 
|         // 新建一个List保存每个分块上传后的ETag和PartNumber | 
|         List<PartETag> partETags = new ArrayList<PartETag>(); | 
|   | 
|         for (int i = 0; i < partCount; i++) { | 
|             // 获取文件流 | 
|             FileInputStream fis = new FileInputStream(partFile); | 
|   | 
|             // 跳到每个分块的开头 | 
|             long skipBytes = partSize * i; | 
|             fis.skip(skipBytes); | 
|   | 
|             // 计算每个分块的大小 | 
|             long size = partSize < partFile.length() - skipBytes ? partSize | 
|                     : partFile.length() - skipBytes; | 
|   | 
|             // 创建UploadPartRequest,上传分块 | 
|             UploadPartRequest uploadPartRequest = new UploadPartRequest(); | 
|             uploadPartRequest.setBucketName(bucketName); | 
|             uploadPartRequest.setKey(key); | 
|             uploadPartRequest.setUploadId(initiateMultipartUploadResult | 
|                     .getUploadId()); | 
|             uploadPartRequest.setInputStream(fis); | 
|             uploadPartRequest.setPartSize(size); | 
|             uploadPartRequest.setPartNumber(i + 1); | 
|             UploadPartResult uploadPartResult = client | 
|                     .uploadPart(uploadPartRequest); | 
|   | 
|             // 将返回的PartETag保存到List中。 | 
|             partETags.add(uploadPartResult.getPartETag()); | 
|   | 
|             // 关闭文件 | 
|             fis.close(); | 
|         } | 
|   | 
|         CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest( | 
|                 bucketName, key, initiateMultipartUploadResult.getUploadId(), | 
|                 partETags); | 
|   | 
|         // 完成分块上传 | 
|         CompleteMultipartUploadResult completeMultipartUploadResult = client | 
|                 .completeMultipartUpload(completeMultipartUploadRequest); | 
|   | 
|         // 校验MD5 | 
|         if (StringUtils.equals(FileDigest.getFileMD5(new File(filename)), | 
|                 completeMultipartUploadResult.getETag())) { | 
|             // 如果一致 | 
|             return "上传成功"; | 
|         } | 
|         return "上传失败"; | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 判断是否存在bucket,如果不存在创建 | 
|      */ | 
|     @SuppressWarnings("deprecation") | 
|     public void isExistBucket(String bucketName) { | 
|         // 获取Bucket的存在信息 | 
|         boolean exists = client.doesBucketExist(bucketName); | 
|         // 输出结果 | 
|         if (!exists) { | 
|             // 不存在创建它 | 
|             client.createBucket(bucketName); | 
|             // 修改权限 | 
|             client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); | 
|         } | 
|   | 
|         // 列举bucket | 
|         // List<Bucket> buckets = client.listBuckets(); | 
|         // for (Bucket bucket : buckets) { | 
|         // System.out.println(" - " + bucket.getName()); | 
|         // } | 
|     } | 
|   | 
|     /** | 
|      * 删除bucket | 
|      * | 
|      * @param bucketName | 
|      * @return | 
|      */ | 
|     @SuppressWarnings("deprecation") | 
|     public boolean deleteBucket(String bucketName) { | 
|         // 判断有没有 | 
|         if (client.doesBucketExist(bucketName)) { | 
|             // 判断bucket是否为空 | 
|             ObjectListing listObjects = client.listObjects(bucketName); | 
|             // 遍历所有Object | 
|             for (OSSObjectSummary objectSummary : listObjects | 
|                     .getObjectSummaries()) { | 
|                 // 删除object | 
|                 client.deleteObject(bucketName, objectSummary.getKey()); | 
|             } | 
|             // 删除Bucket | 
|             client.deleteBucket(bucketName); | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     /** | 
|      * 递归列出目录下所有文件 | 
|      * | 
|      * @param bucketName | 
|      * @return | 
|      */ | 
|     public long getAllBuckets(String bucketName, String prefix) { | 
|         long totalSize = 0; | 
|         // 构造ListObjectsRequest请求 | 
|   | 
|         ListObjectsRequest listObjectsRequest = new ListObjectsRequest( | 
|                 bucketName); | 
|         listObjectsRequest.setPrefix(prefix); | 
|         listObjectsRequest.withMaxKeys(1000); | 
|         // 递归列出fun目录下的所有文件 | 
|         ObjectListing listing = null; | 
|         String nextMarker = null; | 
|         do { | 
|             listObjectsRequest.withMarker(nextMarker); | 
|             listing = client.listObjects(listObjectsRequest); | 
|   | 
|             for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { | 
|                 totalSize += objectSummary.getSize(); | 
|                 System.out.println(objectSummary.getKey() + ":" | 
|                         + objectSummary.getSize()); | 
|             } | 
|             nextMarker = listing.getNextMarker(); | 
|         } while (listing.isTruncated()); | 
|         // 遍历所有Object | 
|         System.out.println("Objects:"); | 
|   | 
|         return totalSize; | 
|     } | 
|   | 
|     /** | 
|      * 下载文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      * @param key        云端已存在文件 | 
|      * @param filename   本地待写入文件 | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws IOException | 
|      */ | 
|     public String downloadFile(String bucketName, String key, String filename) | 
|             throws OSSException, ClientException, IOException { | 
|   | 
|         // 首先检查是否存在目录 | 
|         if (StringUtils.isBlank(filename)) { | 
|             // 待写入文件为空 | 
|             return "ERROR_FILENAME_IS_NULL"; | 
|         } | 
|   | 
|         File file = new File(filename); | 
|         if (!file.exists()) { | 
|             file.createNewFile(); | 
|         } | 
|   | 
|         client.getObject(new GetObjectRequest(bucketName, key), file); | 
|         return filename; | 
|     } | 
|   | 
|     public static void main(String[] args) throws OSSException, | 
|             ClientException, IOException { | 
|         ALiYunUtil aLiYunUtil = new ALiYunUtil("", "uc4nnpsqep1i9fijqr37nokh", | 
|                 "/rp41xCx/XdGEVCptdH6v7xpc9w="); | 
|         // aLiYunUtil.uploadObject("pongto", "work/li2.txt", "D://哈.txt", | 
|         // ".html,.html text/html");D://装机软件/办公学习 | 
|         // aLiYunUtil.partUploadObject("pongto", "work/ps.exe", | 
|         // "D://装机软件/办公学习/Adobe_Illustrator_CS6_XiaZaiBa.exe", | 
|         // ".html,.html text/html"); | 
|         // aLiYunUtil.deleteBucket("pongto"); | 
|     } | 
|   | 
|     /** | 
|      * 上传网络文件 | 
|      * | 
|      * @param bucketName 云端存放bucket名称 | 
|      * @param key        重新命名的文件名 | 
|      *                   将要上传的文件名称 | 
|      * @param mime       超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 | 
|      *                   .rtf application/rtf GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg | 
|      *                   image/jpeg au声音文件 .au audio/basic MIDI音乐文件 mid,.midi | 
|      *                   audio/midi,audio/x-midi RealAudio音乐文件 .ra, .ram | 
|      *                   audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi | 
|      *                   video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar | 
|      *                   application/x-tar | 
|      * @throws OSSException | 
|      * @throws ClientException | 
|      * @throws IOException | 
|      */ | 
|   | 
|     public boolean uploadOnlineObject(String url, String bucketName, String key, | 
|                                       String mime) throws OSSException, ClientException, IOException { | 
|         InputStream inputStream = new URL(url).openStream(); | 
|         if (inputStream != null) { | 
|             // 判断是否存在,不存在创建 | 
|             isExistBucket(bucketName); | 
|   | 
|             ObjectMetadata objectMeta = new ObjectMetadata(); | 
|             objectMeta.setContentLength(inputStream.available()); | 
|             // 可以在metadata中标记文件类型 | 
|             if (StringUtils.isNotBlank(mime)) { | 
|                 objectMeta.setContentType(mime); | 
|             } | 
|             PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, | 
|                     inputStream); | 
|             // 上传回调参数 | 
|             /*    Callback callback = new Callback(); | 
|             callback.setCallbackUrl("http://www.doumee.com"); | 
|             callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com"); | 
|             callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}"); | 
| //            callback.setCallbackBodyType(CallbackBodyType.JSON); | 
|             callback.addCallbackVar("x:var1", "value1"); | 
|             callback.addCallbackVar("x:var2", "value2"); | 
|             putObjectRequest.setCallback(callback);*/ | 
|             try { | 
|                 PutObjectResult putObjectResult = client.putObject(putObjectRequest); | 
|                 return true; | 
|             } catch (Exception e) { | 
|                 // TODO: handle exception | 
|             } | 
|             /*// 读取上传回调返回的消息内容 | 
|             byte[] buffer = new byte[1024]; | 
|             putObjectResult.getCallbackResponseBody().read(buffer); | 
|              | 
|             // 一定要close,否则会造成连接资源泄漏 | 
|             putObjectResult.getCallbackResponseBody().close();*/ | 
|   | 
|             inputStream.close(); | 
|             client.shutdown(); | 
|   | 
|         } | 
|   | 
|         return false; | 
|   | 
|     } | 
|   | 
|     public boolean uploadOnlineObject(InputStream inputStream, String bucketName, String key, | 
|                                       String mime) throws OSSException, ClientException, IOException { | 
|         if (inputStream != null) { | 
|             // 判断是否存在,不存在创建 | 
|             isExistBucket(bucketName); | 
|   | 
|             ObjectMetadata objectMeta = new ObjectMetadata(); | 
|             objectMeta.setContentLength(inputStream.available()); | 
|             // 可以在metadata中标记文件类型 | 
|             if (StringUtils.isNotBlank(mime)) { | 
|                 objectMeta.setContentType(mime); | 
|             } | 
|             PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, | 
|                     inputStream); | 
|             // 上传回调参数 | 
|             /*    Callback callback = new Callback(); | 
|             callback.setCallbackUrl("http://www.doumee.com"); | 
|             callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com"); | 
|             callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}"); | 
| //            callback.setCallbackBodyType(CallbackBodyType.JSON); | 
|             callback.addCallbackVar("x:var1", "value1"); | 
|             callback.addCallbackVar("x:var2", "value2"); | 
|             putObjectRequest.setCallback(callback);*/ | 
|             try { | 
|                 PutObjectResult putObjectResult = client.putObject(putObjectRequest); | 
|                 return true; | 
|             } catch (Exception e) { | 
|                 // TODO: handle exception | 
|             } | 
|             /*// 读取上传回调返回的消息内容 | 
|             byte[] buffer = new byte[1024]; | 
|             putObjectResult.getCallbackResponseBody().read(buffer); | 
|              | 
|             // 一定要close,否则会造成连接资源泄漏 | 
|             putObjectResult.getCallbackResponseBody().close();*/ | 
|   | 
|             inputStream.close(); | 
|             client.shutdown(); | 
|   | 
|         } | 
|   | 
|         return false; | 
|   | 
|     } | 
|   | 
|   | 
| } |