天天看點

java 阿裡雲oss 圖檔,檔案上傳,擷取檔案夾 ,檔案清單

1.配置類

pom 檔案添加依賴

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.3</version>
</dependency>      
/**
 * @author sun
 * @date 2019/5/8 000817:41
 */
public class AliyunOSSConfigConstant {

    //私有構造方法 禁止該類初始化
    private AliyunOSSConfigConstant() {
    }

    //倉庫名稱
    public static final String BUCKE_NAME = "cangku";
    //地域節點 我選的深圳
    public static final String END_POINT = "oss-cn-shenzhen.aliyuncs.com";
    //AccessKey ID 阿裡雲AccessKey
    public static final String AccessKey_ID = "LTA1aaPaMi66tCy1";
    //Access Key Secret 阿裡雲Secret 
    public static final String AccessKey_Secret = "bQ9Re8uV12sasa1KhWdWAbb15EM7w12";

}
           

2.工具類

@Component
public class AliyunOSSUtil {

    private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);
    private static String FILE_URL;
    private static String bucketName = AliyunOSSConfigConstant.BUCKE_NAME;
    private static String endpoint = AliyunOSSConfigConstant.END_POINT;
    private static String accessKeyId = AliyunOSSConfigConstant.AccessKey_ID;
    private static String accessKeySecret = AliyunOSSConfigConstant.AccessKey_Secret;

    /**
     * 上傳檔案。
     *
     * @param file 需要上傳的檔案路徑
     * @return 如果上傳的檔案是圖檔的話,會傳回圖檔的"URL",如果非圖檔的話會傳回"非圖檔,不可預覽。檔案路徑為:+檔案路徑"
     */
    public static String upLoad(File file, String fileHost, String suffix) {

        // 預設值為:true
        boolean isImage = true;
        // 判斷所要上傳的圖檔是否是圖檔,圖檔可以預覽,其他檔案不提供通過URL預覽
        try {
            Image image = ImageIO.read(file);
            isImage = image == null ? false : true;
        } catch (IOException e) {
            e.printStackTrace();
        }

        logger.info("------OSS檔案上傳開始--------" + file.getName());

        // 檔案名格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String dateString = sdf.format(new Date()) + "." + suffix; // 20180322010634.jpg

        // 判斷檔案
        if (file == null) {
            return null;
        }
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            // 判斷容器是否存在,不存在就建立
            if (!ossClient.doesBucketExist(bucketName)) {
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            // 設定檔案路徑和名稱
//            String fileUrl = fileHost + "/" + (dateString + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
            String fileUrl = fileHost + "/" + dateString;
            if (isImage) {//如果是圖檔,則圖檔的URL為:....
                FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl;
            } else {
                FILE_URL = fileUrl;
                logger.info("非圖檔,不可預覽。檔案路徑為:" + fileUrl);
            }

            // 上傳檔案
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
            // 設定權限(公開讀)
            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            if (result != null) {
                logger.info("------OSS檔案上傳成功------" + fileUrl);
            }
        } catch (OSSException oe) {
            logger.error(oe.getMessage());
        } catch (ClientException ce) {
            logger.error(ce.getErrorMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return FILE_URL;
    }

    /**
     * 通過檔案名下載下傳檔案
     *
     * @param objectName    要下載下傳的檔案名
     * @param localFileName 本地要建立的檔案名
     */
    public static void downloadFile(String objectName, String localFileName) {

        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 下載下傳OSS檔案到本地檔案。如果指定的本地檔案存在會覆寫,不存在則建立。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
        // 關閉OSSClient。
        ossClient.shutdown();
    }

    /**
     * 删除檔案
     * objectName key 位址
     *
     * @param filePath
     */
    public static Boolean delFile(String filePath) {
        logger.info("删除開始,objectName=" + filePath);
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        // 删除Object.
        boolean exist = ossClient.doesObjectExist(bucketName, filePath);
        if (!exist) {
            logger.error("檔案不存在,filePath={}", filePath);
            return false;
        }
        logger.info("删除檔案,filePath={}", filePath);
        ossClient.deleteObject(bucketName, filePath);
        ossClient.shutdown();
        return true;
    }

    /**
     * 批量删除
     *
     * @param keys
     */
    public static Boolean delFileList(List<String> keys) {
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            // 删除檔案。
            DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
            List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            ossClient.shutdown();
        }
        return true;

    }

    /**
     * 擷取檔案夾
     *
     * @param fileName
     * @return
     */
    public static List<String> fileFolder(String fileName) {
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 構造ListObjectsRequest請求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 設定正斜線(/)為檔案夾的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 設定prefix參數來擷取fun目錄下的所有檔案。
        if (StringUtils.isNotBlank(fileName)) {
            listObjectsRequest.setPrefix(fileName + "/");
        }
        // 列出檔案
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 周遊所有commonPrefix
        List<String> list = new ArrayList<>();
        for (String commonPrefix : listing.getCommonPrefixes()) {
            String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1);
            String[] s = newCommonPrefix.split("/");
            list.add(s[1]);
        }
        // 關閉OSSClient
        ossClient.shutdown();
        return list;
    }

    /**
     * 列舉檔案下所有的檔案url資訊
     */
    public static List<String> listFile(String fileHost) {
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 構造ListObjectsRequest請求
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);

        // 設定prefix參數來擷取fun目錄下的所有檔案。
        listObjectsRequest.setPrefix(fileHost + "/");
        // 列出檔案。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 周遊所有檔案。
        List<String> list = new ArrayList<>();
        for (int i = 0; i < listing.getObjectSummaries().size(); i++) {
            if (i == 0) {
                continue;
            }
            FILE_URL = "https://" + bucketName + "." + endpoint + "/" + listing.getObjectSummaries().get(i).getKey();
            list.add(FILE_URL);
        }
        // 關閉OSSClient。
        ossClient.shutdown();
        return list;
    }

    /**
     * 獲得url連結
     *
     * @param objectName
     * @return
     */
    public static String getUrl(String objectName) {
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 設定權限(公開讀)
        ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
        // 設定圖檔處理樣式。
//        String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100);
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
        req.setExpiration(expiration);
//        req.setProcess(style);
        URL signedUrl = ossClient.generatePresignedUrl(req);
        // 關閉OSSClient。
        logger.info("------OSS檔案檔案資訊--------" + signedUrl.toString());
        ossClient.shutdown();
        if (signedUrl != null) {
            return signedUrl.toString();
        }
        return null;
    }

    // 擷取文 MultipartFile 檔案字尾名工具
    public static String getSuffix(MultipartFile fileupload) {
        String originalFilename = fileupload.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        System.out.println(suffix);
        return suffix;
    }

    /**
     * 建立檔案夾
     *
     * @param folder
     * @return
     */
    public static String createFolder(String folder) {
        // 建立OSSClient執行個體。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 檔案夾名
        final String keySuffixWithSlash = folder;
        // 判斷檔案夾是否存在,不存在則建立
        if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
            // 建立檔案夾
            ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
            logger.info("建立檔案夾成功");
            // 得到檔案夾名
            OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
            String fileDir = object.getKey();
            ossClient.shutdown();
            return fileDir;
        }

        return keySuffixWithSlash;
    }

    public static void main(String[] args) {
//        createFolder("test/");
//        getUrl("product/class/26065946787446951.jpg");
        listFile("document");
//        fileFolder(null);
//        fileFolder("document");
//        String bucketUrl = "https://jiangpin.oss-cn-shenzhen.aliyuncs.com/other/20190509023515.jpg";
//        String[] s = bucketUrl.split(".com");
//        String path = s[1];
//        path = path.substring(1, path.length());
//        System.out.println(path);
    }
           

3.接口調用service

public ServiceResult<Object> uploadFile(MultipartFile file, String fileHost) {
    ServiceResult<Object> serviceResult = new ServiceResult<>();
    logger.info("檔案上傳");
    String suffix = aliyunOSSUtil.getSuffix(file);
    String filename = file.getOriginalFilename();
    logger.info("檔案上傳filename =" + filename);
    try {

        if (file != null) {
            if (!"".equals(filename.trim())) {
                File newFile = new File(filename);
                FileOutputStream os = new FileOutputStream(newFile);
                os.write(file.getBytes());
                os.close();
                file.transferTo(newFile);
                // 上傳到OSS
                String uploadUrl = aliyunOSSUtil.upLoad(newFile, fileHost, suffix);
                logger.info("檔案上傳結束uploadUrl =" + uploadUrl);
                serviceResult.setData(uploadUrl);
                serviceResult.setMsg("成功");
                serviceResult.setSucceed(true);
                return serviceResult;
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}