阿里云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. javaee和javase的区别

    JavaEE是指Java Enterprise Edition,Java企业版,多用于企业级开发,包括web开发等等.也叫J2EE. JavaSE通常是指Java Standard Edition,J ...

  2. React中引用CSS样式的方法

    相对于html中引用css的三种方法,react中也有三种方法,一一相对: 1. 行内样式:直接在组件内部定义 <div style={{width:'20px',height:'30px'}} ...

  3. linux五天光速入门

    第一章: 01 Linux的安装及相关配置  → B站视频链接(p1-p21) 02 UNIX和Linux操作系统概述    → B站视频链接 第二章: 01 Linux命令及获取帮助   → B站视 ...

  4. 我的前端架构(jquery)汇总

    目录 我的前端架构之一--页面作用域 我的前端架构之二--统一扩展Js方法 我的前端架构之三 -- 页面规范 我的前端架构之四 -- UI控件 我的前端架构之五 -- 一些方案实现 判断对象是否是 e ...

  5. Java连载52-单例模式的缺点以及抽象类

    一.单例模式 1.单例模式的缺点:单例模式的类型没有子类,无法被继承. 例如:下面的例子,由于父类的构造方法是私有的,所以子类中的构造方法是无法创建的,因为它是引用父类的构造方法 package co ...

  6. iOS: 创建静态库,实现自己的API私有使用

    一.介绍 在开发中经常使用到第三方的静态框架,格式基本上就是.framework和.a格式的.使用时,会发现我们只能使用无法修改,这就是静态框架的一个好处,私有性.内部实现的代码只有公开者本人知晓,对 ...

  7. LeetCode 136:只出现一次的数字 Single Number

    题目: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. Given a non-empty array of integers, every e ...

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

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

  9. SpringBoot系列之外部配置用法简介

    SpringBoot系列之外部配置用法简介 引用Springboot官方文档的说法,官方文档总共列举了如下用法: 1.Devtools global settings properties on yo ...

  10. selectpage选择订单的时候,订单数量和金额会动态改变

    1. 2. HTML部分: JS: PHP获取数据并return json