1.25 FAQ
什么是FDS?
FDS是一种基于WEB的存储服务。向开发者提供高度可扩展、可靠的、低延时的存储基础设施。
FDS可以用来做什么?
FDS提供一个简单的Web服务接口,可用于存储和提取任意数量的数据,这些操作可从Web上的任何位置随时执行。
FDS可以存储那种类型的数据?
实际上可以存储任意类型的数据。用户以Object的形式将数据存储在FDS。下载时可以下载整个Object的内容,也可以只下载特定range的内容。
FDS为什么提供的是Restful API,而不是RPC?
FDS是一个基于Web的存储服务,提供Restful API可以使FDS很容易地和其它Web服务(比如CDN)集成在一起。用户也可以通过一个url分享自己存储在FDS上的文件,或在浏览器中展示存储在FDS上的文件。
什么是Region?
请参考基本概念。
什么是Object?什么是Bucket?
请参考基本概念。
我可以创建多少个Bucket?
一个开发者默认可以创建10个Bucket。如果需要创建更多的Bucket,请在控制台申请配额。
如何查看我的 DeveloerpId?
在WebConsole上任意Bucket的属性
> 所有者
栏
如何查看我帐号的存储容量使用情况?
在WebConsole上点击进入Bucket页面,搜索空间配额
我可以存储多少数据?
一个开发者默认可以存储1G的数据。如果需要更大存储空间,请在控制台申请配额。 只要是小米开发者就可以访问FDS,为了防止资源浪费,所以设置了默认1G的存储空间限制。
开发者可存储的总数据量和Object个数没有限制。
一个Bucket中的容量有限制吗?
容量限制是以开发者为单位而不是以Bucket为单位统计的。
单个Object的大小有没有限制?
单个Object的大小没有限制。用户可以上传任意大小的Object。但FDS针对小文件做了优化,对100k左右的文件表现比较好。
什么是开发者?
开发者是在 http://dev.xiaomi.com 上注册,拥有访问小米云服务权限的用户。 访问FDS之前,必须注册小米开发者账号。
刚注册完帐号后,访问 WebConsole 无法正常显示
新注册开发者帐号后,请联系支持群里的管理员开通前端浏览权限。需要提供您的小米 ID
为什么我的Access Key不能创建Bucket
你用的Access Key是App Key,这种Key是不能创建Bucket的。只有开发者才能创建Bucket,开发者对应的Key是Account Key。你可以用Account Key或者在Web console上创建Bucket,然后将相应的权限赋给App Key。
我有一个Object的链接,打不开怎么办?
- 在 WebConsole 上确认这个 Object 是否存在
- 确认这个 Object 的访问权限是否正确设置。
- 在支持群中请求帮助;提供您的链接,说明这个链接是如何产生的 (例如通过presigned url生成),您的 DeveloperId,使用的 Region,以及您下载这个 Object 时的错误信息
什么是public Bucket/Object?
Public Bucket/Object是指不用认证信息就可以访问的Bucket/Object。
什么是presigned url?
访问非public的Object需要认证信息。可以将签名信息放在URL的query parameter中,然后用该URL访问Object是就不需要额外的认证信息了。
什么是分片上传?
分片上传是指将Object分为多个分片,然后单独上传每个分片。对于大Object或网络状况不太好的场景,可以用分片上传实现断点续传。分片上传也可以用来实现并发上传。
FDS支持range请求吗?
支持。可以使用HTTP range header实现range请求。
误删Object后可以恢复吗?
Object删除后会被放在trash中,可以调用Restore Object API恢复被误删的Object。Object删除后在trash中保留7天。
为什么非空的Bucket不能删除?
因为删除包含有大量Objects的Bucket需要很长时间,客户端会超时。所以删除Bucket时要求Bucket是空的。
怎么清空一个Bucket?
可以循环调用DELETE Object或Delete multiple Objects来清空一个Bucket。
PUT和POST的区别是什么?
FDS PUT和POST的语义符合HTTP标注,PUT是覆盖,POST新建。
为什么我覆盖了一个Object后,下载到的还是旧的Object?
不带Authentication信息的下载请求会使Object在访问路径上被缓存,FDS默认缓存4分钟,CDN默认缓存1天。
为什么FDS获取缩略图请求返回415?
- 确认这个Object存在(去除thumb请求参数后是否能正常下载)
- 文件格式是否是jpg/png/gif
- 是否正确设置了content-type
FDS支持数据加密吗?
目前已经支持。
FDS支持跨Region的Bucket replication吗?
现在还不支持,将来会支持。
FDS和Amazon S3有什么区别?
FDS和S3是同一类类型的服务,API基本一致。
FDS java SDK 是线程安全的吗?
2.x 版本以上的 java SDK 中的 GalaxyFDSClient 类在多线程运行中没有被调用setDelimiter函数的话, 是线程安全的。
为什么我上传的视频无法在浏览器中播放?
需要把content-type设置正确才能播放。
怎么上传文件到文件夹?
FDS中文件夹是个虚拟的概念。Object名称中的'/'可以模拟出文件夹。例如2016/05/log这个object,2016和05都可以看作是文件夹。
如何查看我的developerId?
在console上对象存储
> 点击任意Bucket的属性 > 所有者
对应内容
为什么我的文件名里有中文的时候,上传会返回403?
如果非中文的文件名是可以上传/下载的,可以检查一下传入的中文是否多做了转义。
我可以指定上传的object的名字吗?
上传请求分两种:
- PUT请求,可以指定Object的名字。
- POST请求,无法指定Object的名字,FDS会在响应中返回为这个Object生成的唯一名字。
通过POST上传的Object,可以通过通过rename接口修改名字,参考java SDK renameObject方法。
上传Object的是否是否一定要指定MD5?
如果上传的时候指定了MD5,服务端在收到Object的时候会做相应的检查。如果MD5不一致,那么上传操作会失败。
上传较大文件的时候经常失败,怎么办?
上传大文件推荐使用分片上传。
我重新上传了文件,但是从console上下载到的还是旧文件,是为什么?
前端可能有缓存,确认清空缓存再尝试下载
为什么我上传Object的时候提示Bucket不存在?
- 确认已经创建了Bucket
- 确认使用的集群是一致的
如何把Bucket的读/写权限授权给某个appId?
- 在开发者站点上注册为开发者
- 在开发者站点 > 左上角用户名 > 密钥中心 > 云服务密钥 创建新密钥
- 在console上需要授权的Bucket > 属性 > 用户权限 > 添加。其中Grantee填入在第2步中生成的AppID。
我希望其他人可以读取我Bucket下的所有文件,应该怎么办?
在Bucket > 属性 > 组权限 > 添加 > ALL_USER 勾选 Read。
我在命令行用curl上传Object失败,是为什么?
确认上传命令中的url是否用单引号'
引起,避免命令行转义。
如何在FDS上创建目录?
FDS没有目录的概念,我们的WebConsole做了显示上的特殊处理。你可以直接上传一个名字是foo/bar.txt的文件,在console上就会看到有foo"目录",点击后可以看到文件bar.txt
4xx 5xx 状态码的含义
FDS http请求返回的状态码与http标准语义一致
403 状态码的含义
- 403 是没有权限的意思,访问 Bucket/Object 需要有相应的访问权限,需要让 Bucket/Object 拥有者给你赋予相应的权限。
- 可以参考基本概念查看有关授权的详细信息。
429 状态码的含义
- 429 表示请求量太大。FDS里所有的Bucket均分所有资源。如果你的请求量导致其他用户无法获得均分的资源,FDS将会返回429状态码。
- 如果出现429,您可以在console上Bucket的统计页面看到这个Bucket的请求量。
为什么我bucket下有object,调用listobject(bucket, prefix)却无结果?
listobject 的delimiter默认为/
, 如果想获取所有bucket下的所有object,应该设置delimiter为空字符串,如下
listObject(bucket, "", "");
当bucket下的object非常多,该如何列出所有object?
listobject
接口默认最多返回1000个object,当bucket下object过多时,需要用到listNextBatchOfObjects
。listNextBatchOfObjects
的作用是根据上次结果继续list。其输入为FDSObjectListing。 Java 用例:
for (FDSObjectListing objectListing = fdsClient.listObjects(BUCKET_NAME, PREFIX, ""); objectListing != null;
objectListing = fdsClient.listNextBatchOfObjects(objectListing)) {
//do something
if (!objectListing.isTruncated()) {
break;
}
}
预签名上传时,为什么会返回403?
确认签名时的Method、ContentType与使用时一致,参考Presigned URL的note
。
如何通过预签名上传时,设置object为public?
参考 Presigned URL的note
。