在下面的代码之前, 需要知道 bucket,accessKeyId,accessKeySecret, 以及域名 endpoint;
pom.xml:
阿里云存储 -->
- com.aliyun.oss</groupId>
- aliyun-sdk-oss</artifactId>
- 3.5.0</version>
- </dependency>
阿里云配置:
- private static ClientBuilderConfiguration initConf(){
- // 创建 ClientConfiguration.ClientConfiguration 是 OSSClient 的配置类, 可配置代理, 连接超时, 最大连接数等参数.
- ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
- // 设置 OSSClient 允许打开的最大 HTTP 连接数, 默认为 1024 个.
- conf.setMaxConnections(CONF_MAX_CONNECTIONS);
- // 设置 Socket 层传输数据的超时时间, 默认为 50000 毫秒.
- conf.setSocketTimeout(CONF_SOCKET_TIMEOUT);
- // 设置建立连接的超时时间, 默认为 50000 毫秒.
- conf.setConnectionTimeout(CONF_CONNECTION_TIMEOUT);
- // 设置从连接池中获取连接的超时时间 (单位: 毫秒), 默认不超时.
- conf.setConnectionRequestTimeout(CONF_CONNECTION_REQUEST_TIMEOUT);
- // 设置连接空闲超时时间. 超时则关闭连接, 默认为 60000 毫秒.
- conf.setIdleConnectionTime(CONF_IDLE_CONNECTION_TIME);
- // 设置失败请求重试次数, 默认为 3 次.
- conf.setMaxErrorRetry(CONF_MAX_ERROR_RETRY);
- // 设置是否支持将自定义域名作为 Endpoint, 默认支持.
- conf.setSupportCname(true);
- // 设置是否开启二级域名的访问方式, 默认不开启.
- conf.setSLDEnabled(false);
- // 设置连接 OSS 所使用的协议 (HTTP/HTTPS), 默认为 HTTP.
- conf.setProtocol(Protocol.HTTP);
- return conf;
- }
初始化:
- /** OSSClient 实例 */
- private static volatile OSS ossClient;
- /** 双重锁单例 */
- private static OSS getOssClient() {
- if (ossClient == null) {
- synchronized (OSS.class) {
- if (ossClient == null) {
- ClientBuilderConfiguration conf = initConf();
- ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, conf);
- // 程序退出关闭 ossClient
- Runtime.getRuntime().addShutdownHook(new Thread(() -> ossClient.shutdown()));
- }
- }
- }
- return ossClient;
- }
上传:
- // 上传文件
- ossClient.putObject(OSS_BUCKET_NAME, objectName, input, objectMetadata);
- // 获得上传后的 url
- return getImgUrl(OSS_ENDPOINT, OSS_BUCKET_NAME, objectName);
- private static final String PRE_URL = "https://";
- private static final String FILE_SEPARATOR = "/";
- private static final String NAME_SEPARATOR = "_";
- private static final String FILE_POINT = ".";
- public static String getImgUrl(String endpoint, String bucketName, String objectName) {
- StringBuffer sb = new StringBuffer();
- sb.append(PRE_URL);
- sb.append(bucketName);
- sb.append(endpoint.replace(PRE_URL, FILE_POINT));
- sb.append(FILE_SEPARATOR);
- sb.append(objectName);
- return sb.toString();
- }
如果在上传的过程中遇到:
- SecondLevelDomainForbidden
- The bucket you are attempting to access must be addressed using OSS third
- level domain.
- 5D8340FA530E23C38F6FB369
- oss-cn-beijing.aliyuncs.com
网上的办法是: 将 endpoint 设置成 bucket + 域名的方式 http://bucket-name.oss-cn-hangzhou.aliyuncs.com/object
但是会出现一个新的问题:
- SignatureDoesNotMatch
- The request signature we calculated does not match the signature you provided.
- Check your key and signing method.
- 5D8341C13EF51E45DBC0B383
- mgtv-cms-img.oss-cn-beijing.aliyuncs.com
- LTAI4FifYXAfMeWmiwpXWiKv
- QMy+ho20jDfI2KrEBaYAiBlC5aA=
解决办法: 将下面的配置设置成 false 即可
- // 设置是否开启二级域名的访问方式, 默认不开启.
- conf.setSLDEnabled(false);
来源: http://www.bubuko.com/infodetail-3207977.html