使用OSS中的数据作为机器学习的训练样本
DataLakeAnalytics+OSS:基于OSS的Severless的交互式查询分析
通过HDP2.6 Hadoop读取和写入OSS数据
通过CDH5 Hadoop读取和写入OSS数据
Apache Impala(CDH6)查询OSS数据
Spark使用OSS Select加速数据查询
基于OSS+MaxCompute构建数据仓库
数据备份和容灾
备份存储空间
数据库备份到OSS
通过云存储网关使用OSS服务
本地共享文件夹访问
本地磁盘访问
OSS上传提示Name or service not known报错
osscmd工具上传提示InvalidBucketName报错
调用Callback时页面显示400 call back error
OSS服务.netSDK中使用MemoryStream上传文件为空的解决方法
OSS下载rar格式文件,打开后乱码
IE浏览器下载OSS文件后扩展名被省略
OSS支持FTP吗?
OSS文件实现强制下载的方法
OSS Post请求的Policy设置方法
OSS通过range参数获取部分文件
OSS的文件更新后,部分地区下载的文件仍是旧的版本
在OSS控制台中读请求与写请求次数统计的来源
使用OSS的JS SDK上传大于100K的文件时报错
OSS验证Refer防盗链是否生效
OSS变通实现IP黑白名单
STS生成的临时账户授权检查逻辑
OSS的Bucket权限管理
如何获取AccessKeyId和AccessKeySecret
Access key对OSS的bucket控制权限太高,需要对bucket更细粒度的权限控制
RAM子账户授权OSS单个bucket中部分文件的访问权限
oss域名访问提示Anonymous access is forbidden for this operation.
OSS细粒度的权限控制
OSS异常流量排查及防护
如何给子账号赋权OSS的操作?
如何授权RAM子账号列举指定文件目录
Python sdk中multiupload上传如何验证文件完整性
OSS MD5一致性校验说明
OSS下载内容与实际内容不一致
域名/网络
OSS如何查看Bucket内网、外网域名地址
ECS用户如何正确使用OSS内网地址?
OSS是否支持Bucket作为三级域名的访问方式?
OSS是否支持HTTPS访问
通过反向代理访问OSS的HTTPS域名
OSS+CDN访问文件直接下载
OSS设置Object更新时自动刷新CDN缓存
OSS使用SDK访问Bucket提示Endpoint错误
OSS设置CORS规则以后还是报No 'Access-Control-Allow-Origin'的解决方法
访问OSS资源或者使用SDK时提示“ using the specified endpoint”
OSS绑定域名时验证域名所有权
为什么OSS内网域名无法ping通
DNS解析
站点中如何应用OSS资源
OSS如何开启CDN加速服务
OSS触发FIN的条件
OSS上传或下载的带宽限制
OSS上传慢
如何停止绑定域名时默认开启的CDN服务?
如何设置HTTPS证书托管
对象存储OSS中Bucket的访问域名使用介绍
对象存储OSS查看Bucket统计和Object统计方法
通过OSS控制台资源监控报表功能了解Bucket使用情况
通过OSS控制台概览了解Bucket相关属性
OSS通过管理控制台查看资源监控报表的请求次数统计信息
如何授权子账号云查看OSS控制台总概览的基础数据
存储空间(bucket)管理
如何获取OSS上每个文件夹的大小
OSS中可以重命名Bucket吗?是否支持Object迁移?
OSS如何一键删除Bucket
OSS对object和目录的移动与修改操作
OSS的Bucket、Object、文件目录命名规范汇总
OSSFS通过www账户挂载Bucket
OSS API设置LifeCycle提示时间格式错误
OSS开启访问日志
查找OSS Object的访问操作记录
OSS日志里面206代表什么
OSS的Bucket每天会自动生成名称中包含日期的Object
OSS数据操作常见问题FAQ
Bucket下出现异常文件如何排查
如何查看存储空间大小
OSS可创建Bucket个数限制,容量是否需要扩容?
如何删除Bucket
文件(object)管理
OSS怎么更改Object元数据信息
OSS中LifeCycle删除文件的策略
判断OSS文件被删除
OSS删除碎片文件
当Object名称中存在不可见字符如何处理?
OSS有哪些批量操作?
OSS静态文件的打开方式
OSS的gzip压缩如何使用?
IE浏览器中浏览OSS的object URL中文文件名乱码
OSS 如何设置 Content-Type(MIME)?
上传Object后如何获取访问URL
如何给文件重命名
如何修改、更新、编辑文件?
OSS上传文件大小限制
OSS SDK如何进行批量操作?
Java实现生成URL签名的代码示例
PHP实现OSS的签名URL
OSS如何通过sdk获取object的签名URL
OSS中的时间标准
控制台获取签名链接后过一段时间超时
调用oss sdk操作报错:SignatureDoesNotMatch
Object签名URL相关问题
签名错误 (signature not match)
API/SDK
OSS支持时间同步的sdk
nternal.aliyuncs.com...
Oss Java sdk实现listobject(列出所有的object)
使用OSS的javasdk的contentMD5出现log4j警告
OSS Java SDK超时&重传代码样例
测试版PHP SDK中不能自动检测所需PHP模块的原因
OSS API文档 “Date”字段的GMT格式说明
- assumed...
OSS API返回结果有JSON格式的吗?
Python sdk查询所有object列表
iOS SDK和Android SDK如何开启log?
OSS图片处理服务不支持ICO格式图片
OSS图片处理服务绑定域名时提示:域名绑定在自己的其他Bucket上
对象存储OSS控制台操作—图片鉴黄
OSS上传图片时exif信息处理规则
PHP SDK 2.0.1是否支持图片处理服务
OSS 图片处理服务配置文件缓存的方法
怎样用多个域名来使用oss图片服务
图片处理服务处理后的PNG图片的透明背景变黑
OSS 图片处理如何保护原始图片不被访问
OSS图片处理访问报Forbidden access to the original image错误的处理方法
使用图片处理服务,原图无法访问。报错accessdenied。
OSS图片处理服务导致CORS配置失效
OSS图片处理URL访问报错NoSuchStyle, NoSuchKey, NoSuchFile
图片的原图是正常的,被图片处理后就旋转了,该怎样处理
OSS图片处理对原图和缩略图的限制说明
OSS 如何将图片强制缩放成正方形并且不裁剪
图片处理服务是否可以支持跨域操作
OSS上传图片访问URL返回http code值为403
采用
服务端签名后直传
方案有个问题:大多数情况下,用户上传数据后,应用服务器需要知道用户上传了哪些文件以及文件名;如果上传了图片,还需要知道图片的大小等,为此OSS提供了上传回调方案。
流程如下图所示:
当用户要上传一个文件到OSS,而且希望将上传的结果返回给应用服务器时,需要设置一个回调函数,将请求告知应用服务器。用户上传完文件后,不会直接得到返回结果,而是先通知应用服务器,再把结果转达给用户。
服务端签名直传并设置上传回调提供了以下语言的操作示例:
Python
以下根据流程讲解核心代码和消息内容。
用户向应用服务器请求上传Policy和回调。
在客户端源码中的
upload.js
文件中,如下代码片段的变量
serverUrl
的值可以用来设置应用服务器的URL。设置好之后,客户端会向该
serverUrl
发送Get请求来获取需要的信息。
// serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
serverUrl = 'http://88.88.88.88:8888'
应用服务器返回上传Policy和回调设置代码。
应用服务器侧的签名直传服务会处理客户端发过来的Get请求消息,您可以设置对应的代码让应用服务器能够给客户端返回正确的消息。各个语言版本的配置文档中都有明确的说明供您参考。
下面是签名直传服务返回给客户端消息Body内容的示例,这个Body的内容将作为客户端上传文件的重要参数。
{
"accessid":"6MKO******4AUk44",
"host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
"policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1Mjoy******Jjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
"signature":"VsxOcOudx******z93CLaXPz+4s=",
"expire":1446727949,
"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==",
"dir":"user-dirs/"
}
上述示例的callback内容采用的是Base64编码。经过Base64解码后的内容如下:
{"callbackUrl":"http://oss-demo.aliyuncs.com:23450",
"callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
"callbackBodyType":"application/x-www-form-urlencoded"}
callbackUrl:OSS往这个服务器发送的URL请求。
callbackHost:OSS发送这个请求时,请求头部所带的Host头。
callbackBody:OSS请求时,发送给应用服务器的内容,可以包括文件的名称、大小、类型。如果是图片,可以是图片的高度、宽度。
callbackBodyType:请求发送的Content-Type。
用户直接向OSS发送文件上传请求。
在客户端源码
upload.js
文件中,
callbackbody
的值是步骤2中应用服务器返回给客户端消息Body中Callback的内容。
new_multipart_params = {
'key' : key + '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
// 设置服务端返回状态码为200,不设置则默认返回状态码204。
'success_action_status' : '200',
'callback': callbackbody,
'signature': signature,
OSS根据用户的回调设置,发送回调请求给应用服务器。 客户端上传文件到OSS结束后,OSS解析客户端的上传回调设置,发送Post回调请求给应用服务器。消息内容大致如下:
Hypertext Transfer Protocol
POST / HTTP/1.1\r\n
Host: 47.97.168.53\r\n
Connection: close\r\n
Content-Length: 76\r\n
Authorization: fsNxFF0w******MNAoFb//a8x6v2lI1******h3nFUDALgku9bhC+cWQsnxuCo******tBUmnDI6k1PofggA4g==\r\n
Content-MD5: eiEMyp7lbL8KStPBzMdr9w==\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Date: Sat, 15 Sep 2018 10:24:12 GMT\r\n
User-Agent: aliyun-oss-callback\r\n
x-oss-additional-headers: \r\n
x-oss-bucket: signedcallback\r\n
x-oss-owner: 15447******20439\r\n
x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVibGljLm******bi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0=\r\n
x-oss-request-id: 5B9CDDCC9******88AE2BEA1\r\n
x-oss-requester: 15447******20439\r\n
x-oss-signature-version: 1.0\r\n
x-oss-tag: CALLBACK\r\n
eagleeye-rpcid: 0.1\r\n
[Full request URI: http://47.xx.xx.53/]
[HTTP request 1/1]
[Response in frame: 39]
File Data: 76 bytes
HTML Form URL Encoded: application/x-www-form-urlencoded
Form item: "filename" = ".snappython.png"
Form item: "size" = "6014"
Form item: "mimeType" = "image/png"
Form item: "height" = "221"
应用服务器返回响应给OSS。 应用服务器根据OSS发送消息中的authorization
来进行验证,如果验证通过,则向OSS返回如下JSON格式的成功消息。
{
"String value": "ok",
"Key": "Status"
OSS将应用服务器返回的消息返回给用户。
客户端源码解析
客户端源码下载地址:
aliyun-oss-appserver-js-master.zip
说明 客户端JavaScript代码使用的是Plupload组件。Plupload是一款简单易用且功能强大的文件上传工具, 支持多种上传方式,包括HTML、Flash、SilverLight、HTML4。它会智能检测当前环境,选择最适合的上传方式,并且会优先采用HTML5方式。详情请参见
Plupload官网。
下面举例介绍几个关键功能的代码实现:
设置成随机文件名 若上传时采用固定格式的随机文件名,且后缀跟客户端文件名保持一致,可以将函数改为:
function check_object_radio() {
g_object_name_type = 'random_name';
设置成用户的文件名 如果想在上传时设置成用户的文件名,可以将函数改为:
function check_object_radio() {
g_object_name_type = 'local_name';
设置上传目录
上传的目录由服务端指定, 每个客户端只能上传到指定的目录,实现安全隔离。下面的代码以PHP为例,将上传目录改成abc/,注意目录必须以正斜线(/)结尾。
$dir ='abc/';
设置上传过滤条件 您可以利用Plupload的属性filters设置上传的过滤条件,如设置只能上传图片、上传文件的大小、不能有重复上传等。
var uploader = new plupload.Uploader({
filters: {
mime_types : [
// 只允许上传图片和ZIP文件。
{ title : "Image files", extensions : "jpg,gif,png,bmp" },
{ title : "Zip files", extensions : "zip" }
// 最大只能上传400KB的文件。
max_file_size : '400kb',
// 不允许选取重复文件。
prevent_duplicates : true
mime_types:限制上传的文件后缀。
max_file_size:限制上传的文件大小。
prevent_duplicates:限制不能重复上传。
获取上传后的文件名 如果要知道文件上传成功后的文件名,可以用Plupload调用FileUploaded事件获取,如下所示:
FileUploaded: function(up, file, info) {
if (info.status == 200)
document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name);
document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
}
可以利用get_uploaded_object_name(file.name)
函数,得到上传到OSS的文件名,其中file.name
记录了本地文件上传的名称。
上传签名 JavaScript可以从服务端获取policyBase64、accessid、signature这三个变量,核心代码如下:
function get_signature()
// 判断expire的值是否超过了当前时间,如果超过了当前时间,就重新获取签名,缓冲时间为3秒。
now = timestamp = Date.parse(new Date()) / 1000;
if (expire < now + 3)
body = send_request()
var obj = eval ("(" + body + ")");
host = obj['host']
policyBase64 = obj['policy']
accessid = obj['accessid']
signature = obj['signature']
expire = parseInt(obj['expire'])
callbackbody = obj['callback']
key = obj['dir']
return true;
return false;
};
从服务端返回的消息解析如下:
{"accessid":"6MKO******4AUk44",
"host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
"policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
"signature":"I2u57FWjTKqX/AE6doIdyff151E=",
"expire":1446726203,"dir":"user-dir/"}
accessid:用户请求的accessid。
host:用户要往哪个域名发送上传请求。
policy:用户表单上传的策略(Policy),是经过Base64编码过的字符串。详情请参见Post Policy。
signature:对Policy签名后的字符串。
expire:上传策略Policy失效时间,在服务端指定。失效时间之前都可以利用此Policy上传文件,无需每次上传都去服务端获取签名。
说明 为了减少服务端的压力,设计思路是:初始化上传时,每上传一个文件,获取一次签名。再上传时,比较当前时间与签名时间,看签名时间是否失效。如果失效,就重新获取一次签名,如果没有失效,就使用之前的签名。
解析Policy的内容如下:
{"expiration":"2015-11-05T20:23:23Z",
"conditions":[["content-length-range",0,1048576000],
["starts-with","$key","user-dir/"]]
上面Policy中增加了starts-with,用来指定此次上传的文件名必须以user-dir开头,用户也可自行指定。增加starts-with的原因是:在很多场景下,一个应用对应一个Bucket,为了防止数据覆盖,每个用户上传到OSS的文件都可以有特定的前缀。但这样存在一个问题,用户获取到这个Policy后,在失效期内都能修改上传前缀,从而上传到别人的目录下。解决方法为,在应用服务器端就指定用户上传文件的前缀。如果用户获取了Policy也没有办法上传到别人的目录,从而保证了数据的安全性。
设置应用服务器的地址 在客户端源码upload.js
文件中,如下代码片段的变量serverUrl
的值可以用来设置应用服务器的URL,设置好之后,客户端会向该serverUrl
发送Get请求来获取需要的信息。
// serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
serverUrl = 'http://88.88.88.88:8888'
前端如何实现批量上传文件?
OSS没有开放批量上传接口,如果需要批量上传,您可以使用一个循环去上传所有文件,示例与单个上传一致。