文件(Object)上传至存储空间(Bucket)后,您可以通过文件URL将文件分享给第三方预览或下载。

使用OSS控制台

  1. 登录OSS管理控制台
  2. 单击Bucket列表,然后单击目标Bucket名称。
  3. 在左侧导航栏,选择文件管理 > 文件管理
  4. 获取文件URL。
    • 获取单个文件URL
      1. 单击目标文件名称。
      2. 详情面板配置以下参数,然后单击复制文件URL
        参数 说明
        过期时间 当目标文件为私有文件时,需设置文件URL的有效时间。

        取值范围:60~32400

        单位:秒

        若您希望获取更长时效的文件URL,建议使用命令行工具ossutil图形化工具ossbrowser

        自有域名 如需确保第三方访问图片或网页文件时是预览行为,请使用Bucket绑定的自定义域名生成文件URL。

        仅当Bucket绑定自定义域名后可配置此项。更多信息,请参见绑定自定义域名

        使用HTTPS 默认使用HTTPS协议生成文件URL。如需使用HTTP协议生成文件URL,请关闭使用HTTPS开关。
    • 批量获取文件URL
      1. 选中目标文件,然后选择批量操作 > 导出URL列表
      2. 导出URL列表面板配置以下参数:
        参数 说明
        使用HTTPS 默认使用HTTPS协议生成文件URL。如需使用HTTP协议生成文件URL,请关闭使用HTTPS开关。
        过期时间 当目标文件为私有文件时,需设置文件URL的有效时间。

        取值范围:60~32400

        单位:秒

        若您希望获取更长时效的文件URL,建议使用命令行工具ossutil图形化工具ossbrowser

        自有域名 如需确保第三方访问图片或网页文件时是预览行为,请使用Bucket绑定的自定义域名生成文件URL。

        仅当Bucket绑定自定义域名后可配置此项。更多信息,请参见绑定自定义域名

        传输加速域名 若第三方涉及跨国或跨洋等超远距离文件访问场景时,建议使用传输加速域名生成文件URL。

        仅当Bucket开启传输加速后可配置此项。更多信息,请参见开启传输加速

      3. 单击确定,然后将URL列表文件保存到本地。
  5. 将文件URL分享给第三方预览或下载。

使用阿里云SDK

以下仅列举常见SDK通过文件URL将文件分享给第三方预览或下载的代码示例。关于其他SDK通过文件URL将文件分享给第三方预览或下载的代码示例,请参见SDK简介

import com.aliyun.oss.*;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.OSSObject;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "exampleobject.txt";
        // 从STS服务获取的安全令牌(SecurityToken)。
        String securityToken = "yourSecurityToken";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 如果使用sts,请使用如下初始化。
        // 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
        // OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
        try {
            // 指定生成的签名URL过期时间,单位为毫秒。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000);

            // 生成签名URL。
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
            // 设置过期时间。
            request.setExpiration(expiration);
            Map<String, String> headers = new HashMap<String, String>();
            // 如果您希望实现浏览器访问时自动下载文件,并自定义下载后的文件名称,配置文件HTTP头中的Content-Disposition为attachment。
            headers.put("content-disposition","attachment");
            // 如果您希望直接在浏览器中预览文件,配置文件HTTP头中的Content-Disposition为inline并使用Bucket绑定的自定义域名进行访问。
            // headers.put("content-disposition","inline");
            request.setHeaders(headers);
            // 通过HTTP GET请求生成签名URL。
            URL signedUrl = ossClient.generatePresignedUrl(request);
            System.out.println("signed url for getObject: " + signedUrl);

            Map<String, String> customHeaders = new HashMap<String, String>();
            // 添加GetObject请求头。
            customHeaders.put("Range", "bytes=100-1000");
            // 使用签名URL发送请求。
            OSSObject object = ossClient.getObject(signedUrl, customHeaders);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;

// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// 从STS服务获取的安全令牌(SecurityToken)。
$securityToken = "yourSecurityToken";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称。
$bucket= "examplebucket";
// 填写不包含Bucket名称在内的Object完整路径。
$object = "exampleobject.txt";
// 设置签名URL的有效时长为3600秒。
$timeout = 3600;
// 生成预览的签名URL,然后使用Bucket绑定的自定义域名进行访问。
$options= array(
    "response-content-disposition"=>"inline",);
// 生成下载的签名URL。
/*$options = array(
    "response-content-disposition"=>"attachment",
);*/
try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout,'GET',$options);

} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");

// 您可以使用代码来访问签名URL,也可以将生成的签名URL输入到浏览器地址栏中进行访问。
$request = new RequestCore($signedUrl);
// 生成的签名URL默认以GET方式访问。
$request->set_method('GET');
$request->add_header('Content-Type', '');
$request->send_request();
$res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
if ($res->isOK()) {
    print(__FUNCTION__ . ": OK" . "\n");
} else {
    print(__FUNCTION__ . ": FAILED" . "\n");
};                  
const OSS = require('ali-oss');

const client = new OSS({
  // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
  region: 'yourRegion',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // 填写Bucket名称。
  bucket: 'examplebucket'
});

// 获取下载exampleobject.txt文件的签名URL,使用浏览器访问时默认直接预览要下载的文件。
// 填写不包含Bucket名称在内的Object完整路径。
const url = client.signatureUrl('exampleobject.txt');
console.log(url);

// 获取下载exampleobject.txt文件的签名URL,配置文件HTTP头中的Content-Disposition为attachment,实现浏览器访问时自动下载文件,并自定义下载后的文件名称。
// 如果您希望直接在浏览器中预览文件,配置文件HTTP头中的Content-Disposition为inline并使用Bucket绑定的自定义域名进行访问。
const filename = 'ossdemo.txt' // 自定义下载后的文件名称。
const response = {
  'content-disposition': `attachment; filename=${encodeURIComponent(filename)}`
}
// 填写不包含Bucket名称在内的Object完整路径。
const url = client.signatureUrl('exampleobject.txt', { response });
console.log(url);

// 获取上传exampleobject.txt文件的签名URL,并设置过期时间。
// 填写不包含Bucket名称在内的Object完整路径。
const url = client.signatureUrl('exampleobject.txt', {
  // 设置过期时间,默认值为1800秒。
  expires: 3600, 
  // 设置请求方式为PUT。默认请求方式为GET。
  method: 'PUT'  
});
console.log(url);

// 获取上传exampleobject.txt文件的签名URL,并设置Content-Type。
// 填写不包含Bucket名称在内的Object完整路径。
const url = client.signatureUrl('exampleobject.txt', {
  expires: 3600, 
  method: 'PUT',
  'Content-Type': 'text/plain; charset=UTF-8',
});
console.log(url);
# -*- coding: utf-8 -*-
import oss2
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')
# 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
object_name = 'exampledir/exampleobject.txt'

# 指定Header。
headers = dict()
# 如果您希望实现浏览器访问时自动下载文件,并自定义下载后的文件名称,配置文件HTTP头中的Content-Disposition为attachment
# headers['content-disposition'] = 'attachment'
# 如果您希望直接在浏览器中预览文件,配置文件HTTP头中的Content-Disposition为inline并使用Bucket绑定的自定义域名进行访问。
headers['content-disposition'] = 'inline'

# 生成下载文件的签名URL,有效时间为60秒。
# 生成签名URL时,OSS默认会对Object完整路径中的正斜线(/)进行转义,从而导致生成的签名URL无法直接使用。
# 设置slash_safe为True,OSS不会对Object完整路径中的正斜线(/)进行转义,此时生成的签名URL可以直接使用。
url = bucket.sign_url('GET', object_name, 60, headers=headers, slash_safe=True)
print('签名url的地址为:', url)

# 使用签名URL将Object下载到本地。
# 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
# 如果未指定本地路径只设置了本地文件名称(例如examplefile.txt),则下载后的文件默认保存到示例程序所属项目对应本地路径中。
result = bucket.get_object_with_url_to_file(url, 'D:\\localpath\\examplefile.txt')
print(result.read())