阿里云OSS断点续传(Java版本)

在工作中发现开发的某项功能在用户网络环境差的时候部分图片无法显示,通过Review代码之后发现原来是图片上传到了国外的亚马逊服务器上,经过讨论决定将图片上传到国内阿里云的OSS上,下面是通过上网查找资料和看官网API之后写的一个Java版本的断点续传的demo。

注意:这里是上传到你自己的服务器后,然后再上传到阿里云OSS,不是直接通过前端上传的
首先 , 添加maven

<!-- 阿里云OSS服务 -->
    <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
    <dependency>
    <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.3.0</version>
    </dependency>

根据官网断点续传写demo

阿里云官网:https://help.aliyun.com/document_detail/31886.html?spm=a2c4g.11186623.6.564.52d735542GHP78

import java.util.Properties;
    import java.util.PropertyResourceBundle;
    import java.util.ResourceBundle;
     
    import org.apache.commons.lang3.StringUtils;
    import org.apache.log4j.Logger;
     
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.Bucket;
    import com.aliyun.oss.model.Callback;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.UploadFileRequest;
    import com.tinno.gamecenter.biz.util.PropertiesHelper;
    import com.tinno.gamecenter.common.beans.OssUploadBean;
    import com.tinno.gamecenter.core.exception.TinnoCommonException;
     
    /**
     * 阿里云文件存储服务器相关
     * @Title: OssUtil.java
     * @author 王武明
     * @date 2018年9月18日 下午1:50:01
     * @version V1.0
     */
    public class OssUtil
    {
     
        /**
         * 日志
         */
        private static Logger logger = Logger.getLogger(OssUtil.class);
     
        // 阿里云API的内或外网域名
        private static String ALIYUN_OSS_ENDPOINT;
     
        // 阿里云API的密钥Access Key ID
        private static String ALIYUN_ACCESS_KEY_ID;
     
        // 阿里云API的密钥Access Key Secret
        private static String ALIYUN_OSS_ACCESS_KEY_SECRET;
     
        // bucket
        private static String ALIYUN_OSS_BUCKET_ID;
     
        static
        {
            Properties properties = PropertiesHelper.loadPropertiesFile("/config.properties");
            ALIYUN_OSS_ENDPOINT = properties.containsKey("ALIYUN_OSS_ENDPOINT") == false ? "" : PropertiesHelper.getString("ALIYUN_OSS_ENDPOINT", null, properties);
            ALIYUN_ACCESS_KEY_ID = properties.containsKey("ALIYUN_ACCESS_KEY_ID") == false ? "" : PropertiesHelper.getString("ALIYUN_ACCESS_KEY_ID", null, properties);
            ALIYUN_OSS_ACCESS_KEY_SECRET = properties.containsKey("ALIYUN_OSS_ACCESS_KEY_SECRET") == false ? ""
                    : PropertiesHelper.getString("ALIYUN_OSS_ACCESS_KEY_SECRET", null, properties);
            ALIYUN_OSS_BUCKET_ID = properties.containsKey("ALIYUN_OSS_BUCKET_ID") == false ? "" : PropertiesHelper.getString("ALIYUN_OSS_BUCKET_ID", null, properties);
        }
     
        /**
         * 获取阿里云OSS客户端对象
         * @return OSSClient 返回类型
         */
        @SuppressWarnings("deprecation")
        public static final OSSClient getOSSClient()
        {
            return new OSSClient(ALIYUN_OSS_ENDPOINT, ALIYUN_ACCESS_KEY_ID, ALIYUN_OSS_ACCESS_KEY_SECRET);
        }
     
        /**
         * 新建Bucket --Bucket权限:私有
         * @param bucketName bucket名称
         * @return true 新建Bucket成功
         */
        public static final boolean createBucket(OSSClient client)
        {
            Bucket bucket = client.createBucket(ALIYUN_OSS_BUCKET_ID);
            return ALIYUN_OSS_BUCKET_ID.equals(bucket.getName());
        }
     
        /**
         * 删除Bucket
         * @param bucketName bucket名称
         */
        public static final void deleteBucket(OSSClient client, String bucketName)
        {
            client.deleteBucket(bucketName);
            logger.error("删除" + bucketName + "Bucket成功");
        }
     
        /**
         * 通过文件名判断并获取OSS服务文件上传时文件的contentType
         * @param fileName 文件名
         * @return 文件的contentType
         */
        public static final String getContentType(String fileName)
        {
            String fileExtension = fileName.substring(fileName.lastIndexOf("."));
            if (".bmp".equalsIgnoreCase(fileExtension))
                return "image/bmp";
            if (".gif".equalsIgnoreCase(fileExtension))
                return "image/gif";
            if (".jpeg".equalsIgnoreCase(fileExtension))
                return "image/jpeg";
            if (".jpg".equalsIgnoreCase(fileExtension))
                return "image/jpg";
            if (".png".equalsIgnoreCase(fileExtension))
                return "image/png";
            if (".html".equalsIgnoreCase(fileExtension))
                return "text/html";
            if (".txt".equalsIgnoreCase(fileExtension))
                return "text/plain";
            if (".vsd".equalsIgnoreCase(fileExtension))
                return "application/vnd.visio";
            if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension))
                return "application/vnd.ms-powerpoint";
            if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension))
                return "application/msword";
            if (".xml".equalsIgnoreCase(fileExtension))
                return "text/xml";
            return "text/html";
        }
        
        /**
         * 向阿里云的OSS存储中存储文件
         * @author 王武明
         * @date 2018年9月18日 下午4:00:22
         * @param client OSS客户端
         * @param file 上传文件
         * @param bucketName bucket名称
         * @param diskName 上传文件的目录 --bucket下文件的路径
         * @return String 唯一MD5数字签名
         * @throws TinnoCommonException
         * @return String 返回类型
         */
        public static final String uploadObject2OSS(OssUploadBean ossUploadBean) throws TinnoCommonException
        {
            
            OSSClient ossClient = ossUploadBean.getOssClient();
            String fileName = ossUploadBean.getFileName();
            String localePath = ossUploadBean.getLocalePath();
            String checkpointFile = ossUploadBean.getCheckpointFile();
            String key = ossUploadBean.getKey();
            Callback callback = ossUploadBean.getCallback();
            
            try
            {
                UploadFileRequest uploadFileRequest = new UploadFileRequest(ALIYUN_OSS_BUCKET_ID, key);
                
                // 指定上传的内容类型
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setCacheControl("no-cache");
                metadata.setHeader("Pragma", "no-cache");
                metadata.setContentEncoding("utf-8");
                metadata.setContentType(getContentType(fileName));
                
                // 设置存储空间名称
                uploadFileRequest.setBucketName(ALIYUN_OSS_BUCKET_ID);
                // 设置文件名称。
                //uploadFileRequest.setKey("<yourObjectName>");
                // 指定上传的本地文件。
                uploadFileRequest.setUploadFile(localePath);
                // 指定上传并发线程数,默认为1。
                uploadFileRequest.setTaskNum(5);
                // 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
                uploadFileRequest.setPartSize(1 * 1024 * 1024);
                // 开启断点续传,默认关闭。
                uploadFileRequest.setEnableCheckpoint(true);
                // 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数,上传过程中的进度信息会保存在该文件中,
                // 如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。
                // 上传完成后,该文件会被删除。默认与待上传的本地文件同目录,为uploadFile.ucp。
                if (StringUtils.isEmpty(checkpointFile))
                {
                    uploadFileRequest.setCheckpointFile("uploadFile.ucp");
                }else {
                    uploadFileRequest.setCheckpointFile(checkpointFile);
                }
                
                // 文件的元数据。
                uploadFileRequest.setObjectMetadata(metadata);
                // 设置上传成功回调,参数为Callback类型。
                if (callback != null)
                {
                    uploadFileRequest.setCallback(callback);
                }
                
                // 断点续传上传。
                try
                {
                    ossClient.uploadFile(uploadFileRequest);
                }
                catch (Throwable e)
                {
                    e.printStackTrace();
                }
            }
            catch (Exception e)
            {
                logger.error("上传阿里云OSS文件服务器出错!", e);
                throw new TinnoCommonException("上传阿里云OSS文件服务器出错!", e);
            }
            finally
            {
                ossClient.shutdown();
            }
            
            return String.format("https://%s.%s/%s", ALIYUN_OSS_BUCKET_ID,ALIYUN_OSS_ENDPOINT,key);
        }
     
    }

JavaBean,  这里面用来lombok插件,所以无需手动设置set和get

import java.io.File;
     
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.Bucket;
    import com.aliyun.oss.model.Callback;
     
    import lombok.Data;
     
    @Data
    public class OssUploadBean
    {
     
        /**
         * 阿里云Oss上传客户端
         */
        private OSSClient ossClient;
        
        /**
         * 需要上传文件到的某一个桶
         */
        private Bucket bucket;
        
        /**
         * 回调参数
         * 设置文档:https://help.aliyun.com/document_detail/31989.html
         */
        private Callback callback;
        
        /**
         * 需要上传的文件
         */
        private File file;
        
        /**
         * 文件名称
         */
        private String fileName;
     
        /**
         * 文件所在的本地路径
         */
        private String localePath;
     
        /**
         * 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数,上传过程中的进度信息会保存在该文件中,
         * 如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。
         * 上传完成后,该文件会被删除。默认与待上传的本地文件同目录,为uploadFile.ucp。
         */
        private String checkpointFile;
        
        /**
         * 上传到某一个bucket文件夹下
         */
        private String key;
        
    }

config.properties相关配置

#OSS
    ALIYUN_OSS_ENDPOINT=oss-cn-beijing.aliyuncs.com
    ALIYUN_ACCESS_KEY_ID=<your aliyun access key id>
    ALIYUN_OSS_ACCESS_KEY_SECRET=<your access key secret>
    ALIYUN_OSS_BUCKET_ID=<your bucket id>

实际使用Test Method

//上传文件到阿里云OSS服务器
        private String uploadOSS(String fileName, String localePath) throws TinnoCommonException
        {
            try
            {
                OSSClient ossClient = OssUtil.getOSSClient();
                
                OssUploadBean ossUploadBean = new OssUploadBean();
                // 文件名称
                ossUploadBean.setFileName(fileName);
                // 文件上传到自己的服务器的地址
                ossUploadBean.setLocalePath(localePath);
                ossUploadBean.setOssClient(ossClient);
                ossUploadBean.setKey(String.format("%s/%s","folder",fileName));//上传到bucket下的某一个路径
                
                // 返回上传到的oss路径
                return OssUtil.uploadObject2OSS(ossUploadBean);
            }
            catch (Exception e)
            {
                logger.error("上传阿里云服务器出错!", e);
                throw new TinnoCommonException("上传阿里云服务器出错!", e);
            }
        }

编写代码时候遇到的一些问题

1.  设置callback:因为这里我不需要callback所以没有引入callback,这里附上官网设置callback的链接:

https://help.aliyun.com/document_detail/31989.html

2. 上传文件后如何访问:代码在上面,这里附上官网链接:

https://help.aliyun.com/knowledge_detail/39607.html

aliyun-OSS断点续传的更多相关文章

  1. Aliyun Oss 上传文件

    目录 Aliyun OSS OSS 简介 OSS 基本概念 OSS 功能概述 OSS 使用 创建存储空间Bucket 创建子目录 Java编码 测试 Aliyun OSS OSS 简介 阿里云对象存储 ...

  2. Windows下编译使用Aliyun OSS PHP SDK

    摘要: WIN环境下搭建Aliyun OSS PHP SDK编译运行环境.从PHP的安装逐步完成,SDK的编译运行.即使没有任何PHP基础,也能顺利完成. 安装环境:Win7 64 + PHP 5.6 ...

  3. Aliyun OSS SDK 异步分块上传导致应用异常退出

    问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...

  4. aliyun oss操作汇总

    // endpoint以杭州为例,其它region请按实际情况填写 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; ...

  5. com.aliyun.oss.ClientException: Connection error due to: Connection pool shut down

    com.aliyun.oss.ClientException: Connection error due to: Connection pool shut down[ErrorCode]: Unkno ...

  6. Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

    1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地Ngin ...

  7. aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决

    upload ClientException Read timed out com.aliyun.openservices.ClientException: Read timed out        ...

  8. python3.3.5x64+win2003x64+aliyun oss sdk安装步骤

    参考文章:https://help.aliyun.com/document_detail/32026.html?spm=5176.doc31890.6.690.S6ZrRn 1.安装python3.3 ...

  9. oss2模块和aliyun oss链接

    安装oss pip install oss2 首先已经理解OSS 基本概念,如Bucket.Object.Endpoint.AccessKeyId和AccessKeySecret等. 下面介绍如何使用 ...

  10. 前端直传文件到aliyun OSS

    <template> <div id="container"> <div class="img-item m-1 upload-file&q ...

随机推荐

  1. Django celery 使用

    0.安装包 cachetools 3.1.1 celery 3.1.26.post2 celery-with-redis 3.0 certifi 2019.9.11 Django 2.2.6 djan ...

  2. SP2713 GSS4 - Can you answer these queries IV 分块

    问题描述 LG-SP2713 题解 分块,区间开根. 如果一块的最大值是 \(1\) ,那么这个块就不用开根了. 如果最大值不是 \(1\) ,直接暴力开就好了. \(\mathrm{Code}\) ...

  3. 小程序-小菊花loading

    界面----交互 wx.showLoading() 显示loading提示框.需主动调用wx.hideLoading()才能关闭提示框 参数: 属性 类型 默认值 必填 说明 title string ...

  4. 《Java面试全解析》505道面试题详解

    <Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...

  5. 如何创建Azure Face API和计算机视觉Computer Vision API

    在人工智能技术飞速发展的当前,利用技术手段实现人脸识别.图片识别已经不是什么难事.目前,百度.微软等云计算厂商均推出了人脸识别和计算机视觉的API,其优势在于不需要搭建本地环境,只需要通过网络交互,就 ...

  6. IT兄弟连 Java语法教程 数据类型1

    Java是强类型化的语言 Java是一种强类型话的语言,在开始时指出这一点是很重要的.实际上,Java的安全性和健壮性正是部分来自这一事实.强类型意味着什么呢?首先,每个变量都具有一种类型,每个表达式 ...

  7. 一个Web前端工程师或程序员的发展方向,未来困境及穷途末路

    如果你刚好是一个Web前端工程师,或者你将要从事web前端工作.你应该和我有同样的感慨,web前端技术到了自己的天花板,前端工作我能做多少年?3年或5年?自己的职业规划应该怎么样?收入为什么没有增长? ...

  8. MongoDB for OPS 02:复制集 RS 配置

    写在前面的话 对于生产环境而言,除非是非常不重要的业务,且该业务允许我们出现一定时间的停机,我们一般才会使用单节点,且该单节点必须要有完善的备份手段. RS 复制集 我们这里采取一主两从的方式搭建复制 ...

  9. 投色子--html demo

    这是之前客户想要看的一个效果,不知道放在博客里面有没有关系,当做备份吧. <!DOCTYPE HTML> <html> <head> <meta charse ...

  10. 让你彻底理解volatile,面试不再愁

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...