资讯专栏INFORMATION COLUMN

阿里OSS工具类

马忠志 / 2743人阅读

摘要:参考博客阿里入门配置信息配置文件工具类将文件上传到阿里本地文件在阿里中保存的可以包含路径的文件名返回上传后文件的访问路径如果需要上传时设置存储类型与访问权限,请参考以下示例代码。遍历所有文件关闭。

参考博客:阿里OSS入门

bucket配置信息:alios.properties

OSS配置文件:AliOSSConfig.java

@Datapublic class AliOSSConfig {    private String endpoint;    private String accessKeyId;    private String accessKeySecret;    private String bucketName;    private  AliOSSConfig(){        Properties properties = new Properties();        try {            properties.load(AliOSSConfig.class.getResourceAsStream("/oss/alioss.properties"));        } catch (IOException e) {            e.printStackTrace();        }        endpoint = properties.getProperty("endpoint");        accessKeyId= properties.getProperty("accessKeyId");        accessKeySecret= properties.getProperty("accessKeySecret");        bucketName= properties.getProperty("bucketName");    }    private static AliOSSConfig instance = new AliOSSConfig();    public static AliOSSConfig getInstance() {        return instance;    }}

工具类:AliOSSUtil.java

public class AliOSSUtil {    private static final String endpoint = AliOSSConfig.getInstance().getEndpoint();    private static final String accessKeyId = AliOSSConfig.getInstance().getAccessKeyId();    private static final String accessKeySecret = AliOSSConfig.getInstance().getAccessKeySecret();    private static final String bucketName = AliOSSConfig.getInstance().getBucketName();    /**     * 将文件上传到阿里OSS     *     * @param sourceFilePathName 本地文件     * @param aimFilePathName    在阿里OSS中保存的可以包含路径的文件名     * @return 返回上传后文件的访问路径     * @throws FileNotFoundException     */    public static String upload(String sourceFilePathName, String aimFilePathName) throws FileNotFoundException {        FileInputStream is = new FileInputStream(sourceFilePathName);        if (aimFilePathName.startsWith("/")) {            aimFilePathName = aimFilePathName.substring(1);        }        // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。        ObjectMetadata metadata = new ObjectMetadata();        int indexOfLastDot = aimFilePathName.lastIndexOf(".");        String suffix = aimFilePathName.substring(indexOfLastDot);        metadata.setContentType(getContentType(suffix));        //避免文件覆盖        aimFilePathName = aimFilePathName.substring(0, indexOfLastDot) + System.currentTimeMillis() + suffix;        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, aimFilePathName, is);        //避免访问时将图片下载下来        putObjectRequest.setMetadata(metadata);        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        ossClient.putObject(putObjectRequest);        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);        URL url = ossClient.generatePresignedUrl(bucketName, aimFilePathName, expiration);        // 关闭ossClient        ossClient.shutdown();        return url.toString();    }    /**     * 网络实现上传头像到OSS     *     * @param multipartFile     * @return     */    public static String upload(MultipartFile multipartFile) throws IOException {        // 获取上传的文件的输入流        InputStream inputStream = multipartFile.getInputStream();        // 获取文件名称        String fileName = multipartFile.getOriginalFilename();        // 避免文件覆盖        int i = fileName.lastIndexOf(".");        String suffix = fileName.substring(i);        fileName = fileName.substring(0, i) + System.currentTimeMillis() + suffix;        // 把文件按照日期进行分类        // 获取当前日期        String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());        // 拼接fileName        fileName = datePath + "/" + fileName;        // 如果需要上传时设置存储类型与访问权限        ObjectMetadata metadata = new ObjectMetadata();        metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));        // 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream);        putObjectRequest.setMetadata(metadata);        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        ossClient.putObject(putObjectRequest);        //文件访问路径        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);        URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);        // 关闭ossClient        ossClient.shutdown();        // 把上传到oss的路径返回        return url.toString();    }    /**     * 返回contentType     *     * @param FileNameExtension     * @return     */    private static String getContentType(String FileNameExtension) {        if (FileNameExtension.equalsIgnoreCase(".bmp")) {            return "image/bmp";        }        if (FileNameExtension.equalsIgnoreCase(".gif")) {            return "image/gif";        }        if (FileNameExtension.equalsIgnoreCase(".jpeg") ||                FileNameExtension.equalsIgnoreCase(".jpg") ||                FileNameExtension.equalsIgnoreCase(".png")        ) {            return "image/jpg";        }        return "image/jpg";    }    /**     * 列举 指定路径下所有的文件的文件名     * 如果要列出根路径下的所有文件,path= ""     *     * @param path     * @return     */    public static List<String> listFileName(String path) {        List<String> res = new ArrayList<>();        // 构造ListObjectsRequest请求。        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);        // 设置prefix参数来获取fun目录下的所有文件。        listObjectsRequest.setPrefix(path);        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        // 列出文件。        ObjectListing listing = ossClient.listObjects(listObjectsRequest);        // 遍历所有文件        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {            System.out.println(objectSummary.getKey());        }        // 关闭OSSClient。        ossClient.shutdown();        return res;    }    /**     * 列举文件下所有的文件url信息     */    public static List<String> listFileUrl(String path) {        List<String> res = new ArrayList<>();        // 构造ListObjectsRequest请求        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);        // 设置prefix参数来获取fun目录下的所有文件。        listObjectsRequest.setPrefix(path);        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        // 列出文件。        ObjectListing listing = ossClient.listObjects(listObjectsRequest);        // 遍历所有文件。        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {            //文件访问路径            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);            URL url = ossClient.generatePresignedUrl(bucketName, objectSummary.getKey(), expiration);            res.add(url.toString());        }        // 关闭OSSClient。        ossClient.shutdown();        return res;    }    /**     * 判断文件是否存在     *     * @param objectName     * @return     */    public static boolean isFileExist(String objectName) {        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        boolean res = ossClient.doesObjectExist(bucketName, objectName);        return res;    }    /**     * 通过文件名下载文件     *     * @param objectName    要下载的文件名     * @param localFileName 本地要创建的文件名     */    public static void downloadFile(String objectName, String localFileName) {        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));        // 关闭OSSClient。        ossClient.shutdown();    }    /**     * 删除文件或目录     *     * @param objectName     */    public static void delelteFile(String objectName) {        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        ossClient.deleteObject(bucketName, objectName);        ossClient.shutdown();    }    /**     * 批量删除文件或目录     *     * @param keys     */    public static void deleteFiles(List<String> keys) {        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        // 删除文件。        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));        java.util.List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();        ossClient.shutdown();    }    /**     * 创建文件夹     *     * @param folder     * @return     */    public static String createFolder(String folder) {        // 文件夹名        final String keySuffixWithSlash = folder;        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);        // 判断文件夹是否存在,不存在则创建        if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {            // 创建文件夹            ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));            // 得到文件夹名            OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);            String fileDir = object.getKey();            ossClient.shutdown();            return fileDir;        }        return keySuffixWithSlash;    }}

注意:为了避免OSS链接出现 connection pool shutdown错误,不要在类中创建了OSSClient对象 ,因为这样做的话所有方法共用此实例对象,在前端很短的时间内连续提交,造成异常错误。应该将OSSClient对象在方法中创建。

测试代码

class AliOSSUtilTest {    @Test    void upload() throws FileNotFoundException {        //上传文件        String url = AliOSSUtil.upload("E://图片//510.jpg", "/aa/bb/ba.jpg");        System.out.println(url);    }    @Test    void listFileName() {        List<String> res = AliOSSUtil.listFileName("aa/");        res.forEach(System.out::println);    }    @Test    void listFileUrl() {        List<String> res = AliOSSUtil.listFileUrl("aa/");        res.forEach(System.out::println);    }    @Test    void isFileExist() {        boolean res = AliOSSUtil.isFileExist("aa/bb/ab1637160001528.jpg");        System.out.println(res);    }    @Test    void downloadFile() {        AliOSSUtil.downloadFile("aa/bb/ab1637160001528.jpg", "d:/aaawer.jpg");    }    @Test    void delelteFile() {        AliOSSUtil.delelteFile("aa/bb/ab1637160001528.jpg");    }    @Test    void deleteFiles() {        List<String> keys = List.of("aa/bb/ab1637160001528.jpg", "aa/bb/ba1637160268079.jpg","aa/bb/cc");        AliOSSUtil.deleteFiles(keys);    }    @Test    void createFolder() {        String folder = AliOSSUtil.createFolder("aa/bb/cc");        System.out.println(folder);    }}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123892.html

相关文章

  • SpringBoot 整合 阿里OSS 存储服务,快来免费搭建一个自己的图床

    摘要:笔主很早就开始用阿里云存储服务当做自己的图床了。阿里云对象存储文档,本篇文章会介绍到整合阿里云存储服务实现文件上传下载以及简单的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技术的整合,可能是你遇到的讲解最详细的学习案例,力争新手也能看懂并且能够在看完...

    邹强 评论0 收藏0
  • 腾讯云和阿里云对比哪个好?云计算优势测评

    摘要:腾讯云和阿里云针对按量计费的云服务器,均要求账户内有一定的余额腾讯云好像没有最低充值要求,充值元即可阿里云要求账户内至少有元余额。基于上述原因,我们分别在腾讯云和阿里云创建最低配版的云数据库和。 云计算市场争夺阿里云作为名副其实的国内业界第一,名声非常大,不过最近 IT 之家的事闹出来之后,我有点庆幸最终没有选择它。腾讯云算是业界老二,而且有着腾讯这个强大的靠山,云服务产品的种类和质量...

    zengdongbao 评论0 收藏0
  • 基于阿里云Serverless架构下函数计算的最新应用场景详解(一)

    摘要:如果使用阿里云函数计算,您将高峰期每小时的访问日志,或者低谷期每小时的访问日志交给一个计算函数处理,并将处理结果存到中。下面结合阿里云的函数计算产品来讲解各个应用场景中架构以及如何解决的场景中的痛点。 摘要: Serverless概念是近年来特别火的一个技术概念,基于这种架构能构建出很多应用场景,适合各行各业,只要对轻计算、高弹性、无状态等场景有诉求的用户都可以通过本文来普及一些基础概...

    Eidesen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<