阿里云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. ora-12505报错解决方法(转)

    用oracle数据库新建连接时遇到ora-12505,此问题解决后又出现ora-12519错误,郁闷的半天,经过一番折腾问题解决,下面小编把我的两种解决方案分享给大家,仅供参考. 解决方案一: 今天工 ...

  2. acwing 528. 奶酪 解题记录

    习题地址 https://www.acwing.com/problem/content/description/530/ 现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有 ...

  3. WPF 在使用 ItemsSource 之前,项集合必须为空

    原文:WPF 在使用 ItemsSource 之前,项集合必须为空 <DataGrid x:Name="datagrid" ItemsSource="{Bindin ...

  4. WPF Datagrid 动态生成列 并绑定数据

    原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用  可 ...

  5. WPF DataGrid 绑定数据及时更新的处理

    原文:WPF DataGrid 绑定数据及时更新的处理 默认情况下datagrid 绑定数据源后,在界面编辑某一列后,数据不会及时更新到内存对象中.如在同一行上有一个命令对来获取 当前选中行(内存对象 ...

  6. 转载-SpringBoot结合线程池解决多线程问题实录;以及自己的总结

    原文地址:https://blog.csdn.net/GFJ0814/article/details/92422245 看看这篇文章(继续学习):https://www.jianshu.com/p/3 ...

  7. Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤.不过必须注意:要忽 ...

  8. Linux中的buff/cache内存

    我们用free.top等相关能够查询到当前内存的使用情况的命令时,总会有一个buff/cache让我们很困惑. buffer 即写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘. ca ...

  9. OpenGL入门1.7:摄像机

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...

  10. git clone: HTTP Basic: Access denied 错误

    git clone 报 HTTP Basic: Access denied 错误 解决方案: 1. 如果账号密码有变动 用这个命令 git config –-system –-unset creden ...