jancd/qiniu-developer-faq huggingface dataset:
#  如何获取存储文件的外链接

最近更新时间: 2018-08-31 19:23:04

# 公开空间

  1. 直接在内容管理界面上获得链接  
![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/535118/00156efafbc31dae7810d74bce9c534/)

  2. 通过以下地址访问。 
    
        http://<domain>/<key>
    

其中`<domain>`是 bucket 所对应的域名。七牛会给每个 bucket 分配一个测试域名，但由于
[测试域名的访问限制](https://developer.qiniu.com/fusion/kb/1319/test-domain-access-
restriction-rules)，生产环境需要 [绑定自定义域名](https://portal.qiniu.com/domain/create)
访问。 `<key>`可理解为文件名，但可包含文件分隔符等其它字符。可参考：[特殊 key
资源的访问](https://developer.qiniu.com/kodo/kb/special-access-to-key-resources)  
**注意： key必须采用utf8编码，如使用非utf8编码访问七牛云将反馈错误**

  3. [批量获取下载链接](https://developer.qiniu.com/kodo/kb/4072/batch-obtains-download-chain-method)

# 私有空间

1.私有空间区别于公开空间，私有空间在控制台**`无法直接获取外链`**  
![](https://dn-odum9helk.qbox.me/FqfFMrSEoPE8l4vnqYK8HonW2qbv)

2.私有资源必须通过临时 [下载凭证] (/kodo/manual/download-token)(downloadToken)进行下载，如下：

    
    
    [GET] http://<domain>/<key>?e=<deadline>&token=<downloadToken>
    

注意，尖括号不是必需，代表替换项。

`deadline` 由服务器时间加上 指定秒数 表示过期时间点。默认 3600 秒，服务器时间需校准，不要与标准时间相差太大。
`downloadToken` 可以使用 SDK 提供的方法生成。

以下提供python生成私有空间外链的参考代码，更多详细请参考[官方sdk](https://developer.qiniu.com/sdk#official-
sdk)

    
    
    # -*- coding: utf-8 -*-
    # flake8: noqa
    import requests
    
    from qiniu import Auth
    
    #AK、SK可在控制台的个人中心里面获取
    access_key = 'AK'
    secret_key = 'SK'
    
    q = Auth(access_key, secret_key)
    
    #有两种方式构造base_url的形式
    base_url = 'http://%s/%s' % (bucket_domain, key)
    
    #或者直接输入url的方式下载
    base_url = 'http://domain/key'
    
    #可以设置token过期时间
    private_url = q.private_download_url(base_url, expires=3600)
    
    print(private_url)
    r = requests.get(private_url)
    assert r.status_code == 200
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  七牛镜像存储使用手册

最近更新时间: 2019-10-17 20:35:36

# **简介**

七牛的镜像存储服务是一种快速的数据迁移和加速服务。可以帮助用户实现无缝数据迁移，迁移过程中并不影响原有业务系统的访问。镜像存储适用于迁移原有业务系统的已有数据。七牛提供分布式存储和加速分发服务，以分布式存储为核心服务。客户在准备接入七牛的时候一般有两种场景：

场景一

客户业务从设计开发的时候就采用七牛的云存储服务，这种情况下直接将文件上传到七牛，然后再使用七牛的加速分发服务即可。

场景二

客户业务已经建立起来后才准备接入七牛。这种情况下会遇到两个问题，第一个是需要修改上传的业务逻辑，第二个是如何迁移已有的数据。修改上传的业务逻辑，可能涉及到很多项目代码的修改，持续时间可能比较长。已有的数据可以使用七牛提供的同步工具[qshell](https://developer.qiniu.com/kodo/tools/1302/qshell)上传到七牛，但是在上传之后由业务系统产生的新数据总不能每次都找出增量来上传，所以这个时候就可以用到镜像存储了。

  

# **业务模型**

在镜像存储的业务模型里面，原来的图片或者视频访问域名将被配置为七牛的源站，而页面里面引用图片或视频链接的地方必须使用新的访问域名。然后将新的访问域名绑定
(CNAME)
到七牛空间对应的域名。在这些操作完成之后，终端用户就可以通过七牛访问图片或者视频等非结构化资源了。在每个访问请求到七牛的时候，如果七牛空间中不存在这个资源，那么七牛将主动回客户源站抓取资源并存储在空间里面，这样七牛就不需要再次回源客户的资源站点了。镜像存储业务模型如下:

![镜像存储业务模型](https://dn-odum9helk.qbox.me/FmgYGQnovQoMisC1icVwkVwQh5ih)

  

# **配置步骤**

### Step 1

将非结构化数据的源站配置为七牛空间的镜像源站。选择空间，然后在空间的概览页面里，找到镜像存储，然后在镜像源对话框内填入用于回源抓取资源的源站域名。比如将空间
image1 的镜像源站配置为`http://image1.abc.com`。

### Step 2

为空间申请自定义域名，该域名将是新的资源外链的域名。注意加速域名的填写，比如为空间 image1
申请自定义域名`image11.abc.com`，该域名必须是当前业务系统里面没有使用的子域名。

### Step 3

自定义域名审核通过之后，在客户的DNS服务设置那里,就可以根据审核通过后提示的CNAME目标来将自定义域名绑 定到七牛的空间域名。

### Step 4

修改页面中的资源引用域名为新的自定义域名。比如，将新的图片资源外链域名改为`http://image11.abc.com`。

  

# **常见问题**

Q1. 七牛的镜像存储和传统的 CDN 区别是什么？

七牛镜像存储是一种数据迁移的方式，其回源客户的源站也仅仅回源一次，成功抓取资源到七牛的空间之后，不再回源。七牛的存储外面还有一层 CDN 分发网络，这一层的
CDN 分发网络才和传统的 CDN 具有相同的功能。

  

Q2. 七牛的镜像存储的情况下，如何将源站更新的内容同步更新到七牛的空间？

七牛镜像存储的回源操作对相同的文件只抓取一次，后面如果客户的源站更新了文件内容，需要手动调用[镜像资源更新](https://developer.qiniu.com/kodo/api/1293/prefetch)接口来更新七牛空间中的文件，保持内容和客户源站内容相同。另外七牛外围的
CDN
如果需要及时更新缓存的话，也需要利用七牛后台提供的[刷新预取](https://portal.qiniu.com/domain/refresh)功能来刷新
CDN 的缓存。如果不需要及时更新，那么等待 CDN 自动更新即可。

  

Q3. 七牛的镜像存储是否需要永久保留？

七牛的镜像存储是数据迁移的一种方式，之所以提供这种数据迁移方式是为了方便客户修改上传的业务逻辑。在上传的逻辑改为直传七牛之后，后续产生的新的数据将直接存储在七牛的空间。这样在镜像存储保留一段时间之后，源站的回源流量将逐渐趋于
0，这个时候就可以将镜像功能删除了。

  

Q4. 七牛的镜像存储需要修改资源的访问外链域名，如何使用和原有的资源域名相同的域名？

七牛的镜像存储会将原始的资源访问域名设置为源站，而新的资源访问域名必须采用和原始资源访问域名不同的域名。如果需要使用和原有资源域名相同的域名的话，首先需要将镜像源站的域名替换为一个新的子域名或者直接使用
IP 地址，然后将原有的资源域名申请配置为七牛空间的自定义域名，配置成功之后，进行 CNAME 操作，这样原有的页面里面的资源就不需要更改外链域名了。

  

Q4. 七牛的镜像存储回源源站时，User-Agent是什么？

七牛云镜像存储回源源站时，请求会携带固定的User-Agent信息：`<RegionID>-qiniu-imgstg-
spider-1.0`，RegionID为华东z0、华南z1、华北z2、北美na0、东南亚as0。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传慢、上传失败等上传常见问题的处理方法

最近更新时间: 2017-09-18 10:40:05

Q1：上传失败，响应非 200 状态码，我应该怎么处理？  
---  
参考文档：[上传失败常见状态码及解决方法](https://developer.qiniu.com/kodo/kb/3881/upload-the-
common-failure-status-code-and-solve-method)  
  
  

Q2：上传报错 incorrect region Please use up-z(x).qiniu.com ，应该怎么办？  
---  
报错原因是上传域名与空间所属区域不匹配，目前最新版 SDK 均已支持自动切换区域，所以一般更新 SDK 版本到最新版即可解决。  
如果不方便更新版本，可以参照
[存储区域和域名的对应关系](https://developer.qiniu.com/kodo/manual/1671/region-endpoint)
，修改上传域名，或者换一个默认的华东区域的空间。  
  
  

Q3：我的客户反馈上传速度慢，我应该提供哪些诊断信息给七牛？  
---  
参考文档：[上传慢如何诊断？](https://developer.qiniu.com/kodo/kb/2516/slowly-upload)  
  
  

Q4：我上传的文件与预期的不符，有图片变大变小、实际大小不符、图片被压缩、文件不完整等情况。  
---  
首先 [刷新CDN 缓存](https://developer.qiniu.com/fusion/kb/1325/refresh-the-cache-
and-the-effect-of-
time)，刷新完成后，[验证文件一致性](https://developer.qiniu.com/fusion/kb/3644/refresh-the-
cache-fails-consistency-method-validation-file) 。  
  
  

Q5: 我使用第三方插件，确定填写的参数都是对的，但是一直上传不了文件。  
---  
七牛官方没有提供过任何插件。官方社区收录的插件，经过验证都是可以使用的，但一般更新不太及时，不会支持七牛的最新功能或产品。  
上传报错，常见的问题是因为上传指定的空间不是华东的存储空间，换成华东的空间一般可以解决。  
  
以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  "no such domain"相关问题

最近更新时间: 2018-11-13 15:49:38

如果您在访问资源文件时出现“no such domain”的错误，如下所示

    
    
    error: no such domain
    

您可以确认域名类型并参照以下方式进行排查：

# 域名是测试域名

  * 登陆控制台，访问融合cdn的域名设置模块，查看测试域名的回收时间  
![](https://dn-odum9helk.qbox.me/Fh-Sa4xkiiidvSW-0Qf-RH59DWDi)

![](https://dn-odum9helk.qbox.me/FhloDCqNT5JNydnHUK0kqnGD74Gd)

  * 如果您的测试域名已经回收，需要绑定加速域名进行使用  
参考七牛测试域名使用规范：<https://developer.qiniu.com/fusion/kb/1319/test-domain-access-
restriction-rules>  
如何从测试域名过渡到自定义域名：<https://developer.qiniu.com/kodo/kb/5158/how-to-transition-
from-test-domain-name-to-a-custom-domain-name>

# 域名是自定义域名

需要您提交工单，七牛技术支持帮您处理  
<https://support.qiniu.com/tickets/category>

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  教你如何使用七牛云存储

最近更新时间: 2017-09-13 15:58:31

# 七牛云官网

在[七牛云官网](https://www.qiniu.com/)可以查看七牛的近期优惠活动，客户展示，存储和流量计费方式和评估，以及其他的一些七牛云存储的相关信息。

# 账号注册

[七牛账号注册传送门](https://portal.qiniu.com/signup/choice)

# 身份验证

详细说明请查看[认证说明](https://developer.qiniu.com/af/manual/4057/the-identity-
authentication)文档。

注册之后默认为体验用户，免费额度有限，申请身份验证并通过之后，立刻获得10倍的免费额度。

体验用户：

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600375/00157158d51c3252c5ae1b19dc82f9d/)

标准用户：

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600376/00157158d7a18becc5ceab3ec2e32a1/)

# 开发者平台

在[七牛云开发者平台](https://portal.qiniu.com)可以创建空间，测试上传文件，设置空间属性，配置空间自定义域名，空间管理等。另外和财务相关的账单服务也可以在这里设置。

## 首页

![](https://dn-odum9helk.qbox.me/FjgthVM_hXgbl-7xofeAuxcx3yBg)

## 多媒体处理

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600387/00157158e016574c1dfe2332565c4ec/)

## 建立队列

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600384/00157158def6a952866ea0f502b2c5d/)

## 查询Job状态

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600399/00157158e677b8baf10b92791195729/)

## 报表信息

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600403/00157158e898ea616c530e3df17f08c/)

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600405/00157158eb218cb94756b3e4379296a/)

## 账号设置

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600407/00157158ed19971e13e7399d56996ac/)

![blob.png](https://oi2ix6x26.qnssl.com/attachments/download/600409/00157158f0437ed4a8bc8a138f17f7c/)

# 开发者中心

[七牛云开发者中心](https://developer.qiniu.com/)提供了所支持的API的所有详细信息。并提供了覆盖大多数主流编程语言的SDK开发包加速开发者开发。

![00155da908c385225d2028b224c062a](https://oi2ix6x26.qnssl.com/attachments/download/206265/00155da908c385225d2028b224c062a)

# 技术支持

## 文档中心

[七牛云技术支持](https://support.qiniu.com)目前主要通过工单系统和在线问答社区来提供。

## 问答社区

七牛云指定合作的[问答社区](http://segmentfault.com/qiniu)，可以在这里对你困惑的问题提问，并可以得到迅速而专业的工作人员回复。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  空间属性maxAge实现对缓存控制

最近更新时间: 2018-09-30 21:37:44

# 使用空间属性maxAge实现对缓存的控制

  * 通过配置七牛的空间（如下图）属性中 maxAge, 达到配置 HTTP header 中 Cache-Control:max-age的目的。

![](https://dn-odum9helk.qbox.me/FnX3-PPT8CJbBb7MeomQCGPMyQbB)

# 什么是Cache-Control？

  * Cache-Control 通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制,是一种缓存控制的方法。 HTTP header中，服务器可以通过对Cache-Control的设置来指定在文档过期之前将其缓存多长时间。 
  * 例如，七牛控制台可以通过配置Cache-Control: max-age的时间表示从服务器传来文档之时起，认为此文档处于新鲜状态的秒数。

# maxAge值和CDN缓存时间的区别？

访问资源链接时，缓存通常分为浏览器缓存和CDN节点缓存。  
用户在浏览器中输入资源链接访问时，优先使用浏览器缓存，缓存失效或禁用本地缓存后，会向CDN节点请求资源，当CDN缓存时间超时后，会向源站发起资源请求。

  * Cache-Control:max-age:设置缓存存储的最大周期，超过这个时间缓存被认为过期(单位秒)，控制用户浏览器端的缓存。
  * CDN缓存：当CDN缓存超时后，节点认为缓存失效，会向源站重新请求资源。

# 如何查看Cache-Control的maxAge值？

  * 以chrome控制台为例，打开 开发者工具 或 检查，在network标签页下查看。  
![](https://dn-odum9helk.qbox.me/FmFP1Yf577R9H32p6lDhG-4-apiy)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  什么是样式以及样式分隔符？

最近更新时间: 2021-06-22 16:15:38

# 什么是样式

样式是将冗长的数据处理重新定义的一个友好别名，其本质仍然是对图片的处理模式，

可以参考图片处理的相关文档:

[样式 __](https://developer.qiniu.com/dora/manual/1204/processing-mechanism#3)

[图片处理参数 __](https://developer.qiniu.com/dora/manual/3683/img-directions-for-
use)

# 设置图片样式

可以在 [控制台 __](https://portal.qiniu.com/)\- 对象存储 中选择需要配置的存储空间，在图片样式标签配置

![图片样式](https://dn-odum9helk.qbox.me/FuXGqOGi88Dl6ekcGfXX3e3r2h0k)

# 什么是样式分隔符

样式分隔符是用于连接资源链接和图片样式的特殊符号，为防止访问出错，样式名中不可出现当前所启用的识别符

# 设置样式分隔符

可以在 [控制台 __](https://portal.qiniu.com/)\- 对象存储 中选择需要配置的存储空间，在图片样式-
样式分隔符设置中做分隔符配置

![样式分隔符设置](https://dn-odum9helk.qbox.me/FjZI9eYPo2VBnSlFN6XyhFKiV6Jn)

# 示例

样式名称为imageFop，样式内容为：imageView2/0/w/48/h/48，样式分隔符为 -

原始图片链接<http://dn-odum9helk.qbox.me/qiniu-picture1.jpg>[ __](http://dn-
odum9helk.qbox.me/qiniu-picture1.jpg)

通过访问<http://dn-odum9helk.qbox.me/qiniu-picture1.jpg-imageFop>[ __](http://dn-
odum9helk.qbox.me/qiniu-picture1.jpg-imageFop)即可获得效果缩放效果

注意事项：

1、创建分隔符时，不建议使用在样式名称中出现的符号作为分隔符。

2、修改分隔符是个危险操作，全网生效须24小时。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  资源批量上传和多文件上传

最近更新时间: 2024-08-20 14:45:47

# 关于上传

七牛目前只支持一个请求上传一个文件，所以一次上传多个文件的话，就等同于一次发送多个请求，七牛不支持。

# 七牛提供如下解决方案：

  * 服务端，在上传的业务逻辑里加个循环，或者开启多线程、多协程实现并发上传
  * 客户端，发送多个上传请求，每个请求各自上传各自的文件

# 批量上传工具

  * [图形界面化工具 __](https://developer.qiniu.com/kodo/tools/5972/kodo-browser)，可拖拽本地目录上传，适合少量文件上传
  * [命令行工具 __](https://developer.qiniu.com/kodo/tools/qshell)，利用qshell的qupload或者qupload2命令批量上传

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  什么是原图保护？

最近更新时间: 2018-04-25 16:37:23

# 概述

原图保护是七牛云存储针对媒体类源文件的保护措施。

对整个存储空间内`所有的资源`生效，开启后，空间内的文件无法直接通过url进行访问，需要配合[样式分隔符](https://developer.qiniu.com/kodo/kb/1327/what-
is-the-style-and-the-style-
separators)和[图片样式](https://developer.qiniu.com/dora/manual/1204/processing-
mechanism#3)才能访问

# 使用场景

用于控制客户只能访问处理后的资源，如：

  1. 对于存储在七牛上的图片资源，只希望客户访问携带水印的图片
  2. 对于存储在七牛上的图片资源，进行统一的规格化处理

特别需要注意的是，原图保护是一种空间属性，对整个空间的资源都会生效，因此强烈建议对于开启原图保护的空间只存储需要保护原图的图片文件，其他文件使用其他空间存放。

# 访问方式

开启原图(或源文件)保护后，不能通过如下方式访问:

  * `http://绑定域名/文件key或相对路径`
  * `http://绑定域名/文件key或相对路径?操作符/操作符参数`

可以通过如下方式进行公开访问（其中加号“+”忽略）：

  * `http://绑定域名/文件key或相对路径 + 已设定的样式分隔符 + 已设定的图片样式`

如配置分隔符为"-",图片样式名称为"watermarked.jpg"，则以下形式的链接可以访问

  * `http://(Domain)/(Key)-watermarked.jpg`

如果希望对源文件进行访问，可以通过[私有链接签名](https://developer.qiniu.com/kodo/manual/1656/download-
private)的方式，携带鉴权参数访问，但不建议这样使用。

# 设置方法

  1. 设置样式分隔符，可以在 [控制台](https://portal.qiniu.com/) \- 对象存储 中选择需要配置的存储空间，在样式分隔符设置标签配置

![样式分隔符设置](https://dn-odum9helk.qbox.me/FheTsGtzc73YVbZxzfobwwPnPh6U)

  2. 设置图片样式，可以在 [控制台](https://portal.qiniu.com/) \- 对象存储 中选择需要配置的存储空间，在图片样式标签配置

![图片样式](https://dn-odum9helk.qbox.me/FoUC1-NRJxJWY_CfEpJ-wuMenlrR)

  3. 设置原图保护

a. 使用 [qrsctl](https://developer.qiniu.com/kodo/tools/1300/qrsctl\\) protected
命令

b. 在 [控制台](https://portal.qiniu.com/) 的 对象存储中选择需要配置的存储空间，在空间设置标签选择开启或关闭原图保护功能

![空间设置](https://dn-odum9helk.qbox.me/Fs1lMcZI-gJSPiuqCMxRU1ZmZQNl)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传失败常见状态码

最近更新时间: 2017-08-22 15:31:40

在上传失败返回信息中，可以看到 http 状态码，几种常见错误如下：

状态码 | 说明  
---|---  
400 | 请求报文格式错误。  
`incorrect region` 表示上传域名与上传空间的区域不符，此时需要升级 SDK 版本。  
401 | 鉴权失败。  
`token not specified` 表示上传请求中没有带 token ，可以抓包验证后排查代码逻辑。  
`bad token` 表示 token 错误，说明生成 token 的算法有问题，建议直接使用七牛的服务端 SDK 生成 token。  
`token out of date` 表示 token 过期，推荐 token 过期时间设置为 3600 秒（1
小时），如果是客户端上传，建议每次上传从服务端获取新的 token 。  
403 | 权限不足。  
`key doesn't match scope` 表示上传文件指定的 key 和上传 token 中，putPolicy 的 scope
字段不符。上传指定的 key 必须跟 scope 里的 key 完全匹配或者前缀匹配。  
`ExpUser can only upload image/audio/video/plaintext`
表示账号是体验用户，体验用户只能上传文本、图片、音频、视频类型的文件，完成实名认证即可解决。  
579 | 上传成功，回调失败。  
需要确认回调服务器接受 POST 请求，并可以给出 200 的响应。  
大文件上传失败 | 大文件上传容易受到网络波动影响，推荐使用分片上传。如果使用上传工具，推荐使用 [qshell](https://developer.qiniu.com/kodo/tools/1302/qshell) 工具。  
  
以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  如何将阿里云 OSS上 的文件迁移到七牛云存储？

最近更新时间: 2020-03-20 11:49:43

很多用户有需求将阿里云对象存储（OSS）中的文件同步到七牛云对象存储空间（KODO）中，对此，七牛云提供了相应的
[qshell工具](https://developer.qiniu.com/kodo/tools/qshell)
帮助用户，下面以一个具体的案例讲解操作步骤：

首先需要下载七牛云提供的 [qshell工具](https://developer.qiniu.com/kodo/tools/qshell)。大致流程是使用
qshell 工具的
[alilistbucket](https://github.com/qiniu/qshell/blob/master/docs/alilistbucket.md)
命令获取一份包含阿里云对象存储中文件的文件列表，然后再使用 qshell 工具的
[batchfetch](https://github.com/qiniu/qshell/blob/master/docs/batchfetch.md)
命令批量抓取文件列表中的文件到七牛云存储空间中。

# 本案例中的参数

## 七牛云对象存储参数

  * AccessKey/SecretKey：[获取](https://portal.qiniu.com/user/key)
  * Bucket：`qiniu-test-bucket`

## 阿里云对象存储参数

  * DataCenter：`oss-cn-shanghai.aliyuncs.com`
  * Bucket：`ali-qiniu`
  * AccessKeyId、AccessKeySecret：[获取](https://ak-console.aliyun.com/#/accesskey)
  * ListBucketResultFile：`alitoqiniu.txt`

# 1、获取阿里对象存储的文件列表

1.使用 `qshell account <AK> <SK> name` 设置或显示当前用户的 AccessKey 和 SecretKey
，name为在本地自定义的用户名，可以填写您的七牛云账户邮箱。  
2.使用 qshell 里面的
[alilistbucket](https://github.com/qiniu/qshell/blob/master/docs/alilistbucket.md)
命令 列举出阿里云 OSS 中的文件的文件列表

此例中的 OSS 文件列表如下：  
![](https://dn-odum9helk.qbox.me/document/how-to-ali-cloud-oss-files-on-
migration-to-seven-niuyun-storage-01.png)

    
    
    qshell alilistbucket <DataCenter> <Bucket> <AccessKeyId> <AccessKeySecret> [Prefix] <ListBucketResultFile>
    

其中`DataCenter` `Bucket` `AccessKeyId` `AccessKeySecret`要和 OSS
里面相对应，更详细的说明：[点我查看](https://github.com/qiniu/qshell/blob/master/docs/batchfetch.md)。

qshell 运行的命令如下：

    
    
    qshell alilistbucket oss-cn-shanghai.aliyuncs.com alitoqiniu xxx xxx alitoqiniu.txt
    

如果不写`Prefix`则列举出所有的文件，后面的`alitoqiniu.txt`也可以写成绝对路径。  
运行后可以看到本地`alitoqiniu.txt`里面的文件如下：  
![](https://dn-odum9helk.qbox.me/document/how-to-ali-cloud-oss-files-on-
migration-to-seven-niuyun-storage-02.png)

# 2、抓取阿里云对象存储文件到七牛存储空间

1.使用
[batchfetch](https://github.com/qiniu/qshell/blob/master/docs/batchfetch.md)
命令将这个文件里面的文件批量抓取到七牛云存储空间中，但是 `batchfetch` 抓取的是可访问的文件的外链，所以在这之前还需要对上面的
`alitoqiniu.txt` 进行处理，需要拼接为可访问的文件外链的形式。  
这一步可以使用 linux 下 awk 文本处理工具进行拼接，这里直接给出命令如下：

    
    
    cat alitoqiniu.txt | awk '{print "http://ali-qiniu.oss-cn-shanghai.aliyuncs.com/"$1}' >batchfetchurls.txt
    

再次`cat batchfetchurls.txt`里面的文件列表如下：  
![](https://dn-odum9helk.qbox.me/document/how-to-ali-cloud-oss-files-on-
migration-to-seven-niuyun-storage-03.png)

2.使用 `batchfetch` 命令进行同步，这里直接给出同步命令：

    
    
    qshell batchfetch qiniu-test-bucket -i batchfetchurls.txt
    

运行结果如下：  
![](https://dn-odum9helk.qbox.me/document/how-to-ali-cloud-oss-files-on-
migration-to-seven-niuyun-storage-04.png)

至此即同步成功，可以看到七牛云存储空间里面也有相关的文件了：  
![](https://dn-odum9helk.qbox.me/document/how-to-ali-cloud-oss-files-on-
migration-to-seven-niuyun-storage-05.png)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  密钥安全使用须知

最近更新时间: 2019-04-12 16:06:36

# 安全机制

数据安全性是云存储服务的重中之重。云存储的安全机制主要需要考虑以下几个因素：

  * 如何判断该请求方是否合法，且对目标空间有相应的访问权限。
  * 因为服务的访问协议同时支持HTTP和HTTPS，服务端需要判断收到的请求是否经过篡改。
  * 相比上传新资源，覆盖文件或删除已有资源拥有更高的风险。因此对上传或修改动作，需要确认请求方是否拥有修改或删除的权限。

在使用七牛云存储服务的过程中，需要考虑安全机制的场景主要有如下几种：

  * 上传资源
  * 访问资源
  * 管理和修改资源

这三个场景需要考虑不同的安全因素，因此七牛针对性的提供了三种安全机制：[上传凭证](http://developer.qiniu.com/article/developer/security/upload-
token.html)、[下载凭证](http://developer.qiniu.com/article/developer/security/download-
token.html)和[管理凭证](http://developer.qiniu.com/article/developer/security/access-
token.html)。

因为凭证的生成需要用到[SecretKey](http://developer.qiniu.com/article/developer/security/index.html#aksk)，因此该生成动作不应在不受信任的环境中进行。需要注意的是，开发者绝不能将密钥包含在分发给最终用户的程序中，无论是包含在配置文件中还是二进制文件中都会带来非常大的密钥泄漏风险。

SecretKey可在下面这地方获取：

![凭证创建和使用流程](https://dn-
odum9helk.qbox.me/Fp5zMuYakcMWYnWR8ZMVyMhFclpH?imageView/2/w/800)

# 密钥

密钥（AccessKey/SecretKey）用于以上几种凭证的生成。以 SecretKey
为参数，配合适当的签名算法，可以得到原始信息的数字签名，防止内容在传递过程中被伪造或篡改。

密钥通常为成对创建和使用，包含一个AccessKey和一个SecretKey。其中AccessKey会在传输中包含，而用户必须保管好SecretKey不在网络上传输以防止被窃取。若SecretKey被恶意第三方窃取，可能导致非常严重的数据泄漏风险。因此，如发现SecretKey被非法使用，管理员应第一时间在[七牛开发者平台](https://portal.qiniu.com/)上更换密钥。

在具体描述各种凭证的详细生成过程中我们会看到AccessKey和SecretKey是如何被使用的。

**凭证的详细生成** 跳转链接：
<http://developer.qiniu.com/article/developer/security/index.html>

# 使用场景

七牛推荐客户将 AccessKey和一个SecretKey 放在服务端，由服务端生成令牌后颁发给客户端使用。

比如，上传文件的时候：

  1. 业务服务器的服务端生成上传令牌（UploadToken）
  2. 客户端程序（iOS、Android 以及 Web）拿到这个上传令牌之后就可以直接将文件上传到七牛

# 错误案例

把 AK/SK 放在客户端 SDK 中来做签名生成令牌，随 App 被发布出去。

这样做会被人家反编译之后拿到 AK/SK，之后他们就可以对你的账号进行操作。

实际上 Web 端 js 也是可以做签名的，只是你不可能把明文的 AK/SK 放在 Web 端，这样做更加危险。

将 AK/SK 加密后存放在客户端，等用户启动应用的时候再将 AK/SK 解密出来放在内存中，关闭应用后这对 AK/SK 即消失。

这样的做法也是不科学的，因为你的 AK/SK 在 后台 随时可以更改，特别是在被泄漏之后建议使用一对新的 AK/SK。如果你写死在 App
中将其发布，就只能通过发布新版本的 App 来更新这对 AK/SK。

# 最后建议

出于安全考虑，建议您根据自己的场景周期性地更换密钥。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  公开空间和私有空间介绍

最近更新时间: 2017-08-30 18:49:54

创建空间时，可设置为公开空间或私有空间。

公开空间，可通过文件对象的 URL 直接访问。如果要使用七牛云存储的镜像存储功能，请设置空间的属性为公有。

私有空间，文件对象的访问则必须获得拥有者的授权才能访问。

公开和私有仅对空间的读文件生效，修改、删除、写入等对空间的操作均需要拥有者的授权才能进行操作。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  如何避免用户上传同名文件

最近更新时间: 2022-05-19 17:00:54

# 问题概述

## 标题： 如果避免用户上传同名文件呢（即相同key值的文件）？

以前自己做存储的时候，是自己计算文件 hash，上传时查询如果存在的就不保存了。

现在改用七牛做存储了，看七牛上传返回的有文件 hash，但是不知道七牛的是如何计算出来的。

有没有办法在上传之前就可以知道七牛的存储空间里有没有相同的 hash 已经存在了，这样就不用向七牛上传相同的文件了，还是仍然需要自己实现这种排重计算？

## 答：

上传到七牛云存储的时候，key 是可选的。如果你不指定 key，则自动以 hash 值作为
key，此时自动带了消重能力。两个用户用同样的上传姿势上传相同的文件，最终的 key 是一样的。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传 401 错误码

最近更新时间: 2018-11-21 18:50:25

## 一、报错：`{"error":"expired token"}，{“error”:”token out of date”}`

### 处理方法：

1、将token的有效期设置的长一些。对于比较大的文件，可以适当加长有效期（默认是3600秒）

2、看下自己的服务器时间是否是联网时间。如果时间不准，导致签名后的结果可能已经是过期的了

3、建议客户每次上传都重新请求一次上传token。或者设置的时间长些

## 二、报错：`{"error":"bad
token","reqid":"t1wAAHuwANZHl9YT","details":["UP:4/401"],"code":401}`

### 处理方法：

1、检查密钥（ak，sk复制黏贴有误）信息是否正确。

2、数字签名错误（签名方法是自己写的）， 建议使用sdk中封装的方法。

3、检查上传参数，上传token由三部分组成（由冒号隔开），最后一段，用base64解码，可以看到你的上传策略中的参数，如果参数有问题也会报401。

4、如果使用我们的sdk生成的token出现的问题，把token给我们（七牛后台耳机图标：提交工单）， 如果是自己写的，请检查token生成的相关代码。

## 三、使用七牛sdk生成的token还是报错401

如果客户端获取到从服务端生成的token上传报错401，在确认ak和sk没有问题的情况下，则可以使用curl工具模拟上传一下。

    
    
    curl -v -F 'key=1111' -F 'token=g8D_Ledyo2iocGucAXSMEJqPFDly70AaHKCpQznb:5-oM4A7Hv8DTS1DVwBjE56x85sw=:eyJzY29wZSI6Inpob3VjaHVhbmciLCJkZWFkbGluZSI6MTQyNjc0NjY0Mn0=' -F 'file=/usr/local/test.txt' upload.qiniup.com
    

其中key为上传文件名，file为本地文件路径;

如果可以正常响应hash和key则说明token是没有问题，客户端获取token出现了问题。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  js sdk 使用常见问题

最近更新时间: 2018-01-19 00:54:01

## 案例1：

Q：如何在文件上传后，删除上传成功的文件记录UI，只保留正在上传，和报错的文件UI。  
A：要在FileUploaded方法中调用UI逻辑来实现。不要使用RemoveFile方法因为：这个方法是删除文件，终止上传的，跟UI没关系。具体的业务代码需要客户自己实现。

* * *

## 案例2:

Q：上传文件时，出现400:{"error":"read exceed block size"} 报错

A：首先更换最新的qiniu.js,然后清除掉本地浏览器中的localstory，然后重试文件上传，如果还有错误，请用我们官方提供的默认main.js.如果成功说明是你们main.js修改的不正确导致。

* * *

## 案例3:

Q：上传的时候，如何初始化多个按钮绑定多个事件来上传？ A：可以参照<https://github.com/qiniu/js-
sdk/blob/master/src/qiniu.js#L278-L293>  
中var Qiniu = new
QiniuJsSDK();这是每次初始化一个对象来上传，你可以新建多个对象来上传就可以了。你新建多个对象，每次新建一个对象就可以重新获取一次token。

* * *

## 案例4:

不设置 chunk_size 、或 chunk_size: 0、或 chunk_size: '0'、或 chunk_size: '0mb'
，在html5下也是使用直传

## 案例5:

报错信息：

![js](https://dn-odum9helk.qbox.me/fa5deb1d04b47953870a8cf29e947c9d)

解决方法：

![js－02](https://dn-odum9helk.qbox.me/dcf17708efef427b2fab2ad01681a83c)

将箭头的代码注释掉。

* * *

## 案例5:

Q：JS上传报 400，token is not spcified

A：在上传时指定upload_url上传，需要明确在服务端生成的token的地址返回给客户端时需要返回的token是JSON格式。

* * *

## 案例6：

Q: 400 incorrect region

A: 使用静态服务器来运行demo,否则无法调用获取上传host的接口。或者更改qiniu.js中uploadhost为错误提示中的host
![](https://dn-odum9helk.qbox.me/Fvnh9Ig7XRImHhrP8ptOeHzj8n8s)

* * *

## 案例7：

Q: Moxie not defined

A: 使用2.1.1 ~ 2.1.9 版本的plupload

* * *

## 案例8：

Q: Filters在部分安卓机型微信浏览器中无法生效

A:
建议取消filters参数，直接在FileAdded里做判断，参考<http://jsdemo.gugaobai.top/scripts/main.js>

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  使用 qshell 同步目录

最近更新时间: 2018-12-06 15:26:25

# 简介

该文档主要介绍使用 qshell 如何同步本地文件目录到存储空间并体现出层级结构。

  

# 环境

系统介绍：Linux（ ubuntu16.04 ）

要上传的资源目录：

![](https://dn-odum9helk.qbox.me/Fuz2M1jqyfuonqSaFoYzUv6JVSS5)

  

# 配置

  

## 第一步：工具下载

命令行工具 qshell [传送门](https://developer.qiniu.com/kodo/tools/1302/qshell)

本例下载工具版本如下：

文件名 | 描述  
---|---  
qshell_linux_x64 | Linux 64位系统  
  
文件下载后重命名并赋予qshell执行权限，命令行操作如下：

    
    
    $ mv qshell-linux-x64 qshell
    $ chmod +x qshell
    

  

## 第二步：配置环境变量

本例使用最简便的方法，直接放到环境变量。命令行操作如下：

    
    
    $ sudo mv qshell /usr/bin/
    

  

操作完成后再重新开启一个终端既可运行 qshell，如下：

    
    
    $ qshell
    Use help or help [cmd1 [cmd2 [cmd3 ...]]] to see supported commands.
    

  

## 第三步：配置账户

需要鉴权的命令都需要依赖七牛账号下的 AccessKey 和 SecretKey
。[传送门](https://portal.qiniu.com/user/key)

    
    
    $ qshell account <Your AccessKey> <Your SecretKey>
    

操作完成后可以使用命令 `qshell account` 查看当前用户设置的 AccessKey 和 SecretKey 。

  

此处操作后在当前用户主目录中生成 qshell 目录：

    
    
    $ ls ~/.qshell/
    account.json
    

  

## 第四步：编写同步目录文件

在上文提到的 qshell 目录中创建配置文件，文件内容如下：

    
    
    $ cat upload.conf 
    {
        "src_dir" : "/home/boponik/XBOX",
        "bucket" : "xbox"
    }
    

  

注意：

如果想要忽略本地文件的相对路径，比如本地存在一些层级；  
但是层级里面的文件和外面的文件名称和内容都相同的情况下，为了避免重复上传不需要的文件，可以使用忽略本地文件的相对路径的方法。

则配置文件为：

    
    
    $ cat upload.conf 
    {
        "src_dir" : "/home/boponik/XBOX",
        "ignore_dir" : true,
        "bucket" : "xbox"
    }
    

  

## 第五步：同步资源

详细参数说明：<https://github.com/qiniu/qshell/blob/master/docs/qupload.md>

    
    
    qshell qupload <LocalUploadConfig> [flags]
    

  

### 同步资源

![](https://dn-odum9helk.qbox.me/FpVk2u7wYkPHWfptBAjxogkiozgA)

  

### 查看同步日志

![](https://dn-odum9helk.qbox.me/FiUi2VTmVENCIrIlO7l1vEyiKV-E)

  

### 控制台查看资源

到七牛云控制台进入空间 xbox

![](https://dn-odum9helk.qbox.me/FghHOFh-P9-aQ56fASm3vxmWyalu)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  PHP 框架使用七牛

最近更新时间: 2018-10-29 14:32:10

# thinkPHP

具体的 [参考实例](https://dn-odum9helk.qbox.me/logK8HdBqIMjbM8GbU0LhU5FlVtv.zip)  
  

# 1、安装

将七牛 SDK 解压包完整放入 ThinkPHP 项目的 ThinkPHPLibraryVendor 目录下

# 2、使用

引入文件并加载相应需要用到的命名空间

    
    
    <?php
    namespace Home\Controller;
    use Think\Controller;
    Vendor('sdk.autoload'); 
    use \Qiniu\Auth;
    use \Qiniu\Storage\UploadManager;
    class IndexController extends Controller {
        public function index(){
    
            // 用于签名的公钥和私钥
            $accessKey = 'xxx';
            $secretKey = 'xxx';
    
            // 初始化签权对象
            $auth = new Auth($accessKey, $secretKey);
    
            // 空间名  https://developer.qiniu.io/kodo/manual/concepts
            $bucket = 'bucket';
            // 生成上传Token
            $token = $auth->uploadToken($bucket);
            // 构建 UploadManager 对象
            $uploadMgr = new UploadManager();
            // 上传文件到七牛
            $filePath = 'php-logo.png';
            $key = 'php-logo.png';
            list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
            echo "\n====> putFile result: \n";
            if ($err !== null) {
                var_dump($err);
            } else {
                var_dump($ret);
            }
        }
    }
    
    

# Yii

具体的 [参考实例](https://dn-odum9helk.qbox.me/li99N2IlbrIcVPRimTiRzklKE-wn)  
  

# 1、安装

将七牛 SDK 解压包完整放入 Yii 项目的 vendor 目录下

# 2、使用

引入文件并加载相应需要用到的命名空间

    
    
    <?php
    
    // comment out the following two lines when deployed to production
    defined('YII_DEBUG') or define('YII_DEBUG', true);
    defined('YII_ENV') or define('YII_ENV', 'dev');
    
    require(__DIR__ . '/../vendor/autoload.php');
    require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
    
    $config = require(__DIR__ . '/../config/web.php');
    
    require(__DIR__ . '/../vendor/sdk/autoload.php');
    
    use Qiniu\Auth;
    use Qiniu\Storage\UploadManager;
    
    $accessKey = 'xxxx';
    $secretKey = 'xxxx';
    $bucket = 'xxx';
    $auth = new Auth($accessKey, $secretKey);
    
    $uptoken = $auth->uploadToken($bucket, null, 3600);
    
    echo $uptoken;
    
    //上传文件的本地路径
    $filePath = 'xxxx';
    
    $uploadMgr = new UploadManager();
    
    list($ret, $err) = $uploadMgr->putFile($uptoken, null, $filePath);
    echo "\n====> putFile result: \n";
    if ($err !== null) {
        var_dump($err);
    } else {
        var_dump($ret);
    }
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  七牛回调及回调鉴权

最近更新时间: 2020-09-11 17:52:55

# 概述

客户上传文件到七牛后，七牛服务器会响应 200 状态码，响应内容包括 hash 和 key 。但是如果客户需要自定义响应内容，则可以通过设置回调来实现。

# 回调实现

客户端需要在上传 token 中设置 `callbackurl` 和 `callbody`

1、`callbackurl` 必须是公网上可正常进行 POST 请求并能正常响应的 url，并且业务服务器返回给七牛的内容必须是 json 串.

这里给一个最简单的能响应200的php代码(获取 `callbackbody` 并打印一个字符串给客户端)

    
    
    <?php   
    $notifyBody = file_get_contents('php://input');   
    file_put_contents("test.txt",$notifyBody);   
    $arr=array("date"=>"test");   
    echo json_ encode($arr);   
    ?>
    

2、`callbackbody` 是需要向业务服务器发送的回调内容，需使用七牛的魔法变量或自定义变量来填充。  
但是格式一定要正确，否则会报400格式错误.

例如 java 中正确的格式：

    
    
    auth.uploadToken(bucket,key,3600,new StringMap()   
    .put("callbackUrl","callbackurl")   
    .put("callbackBody", "{"filename":$(fname),"filesize":$(fsize),"width":$(imageInfo.width)}") );
    

3、`callbodytype` 默认是 `application/x-www-form-urlencoded`, 也可在上传策略中设置为
`application/json`

# 回调鉴权

因为回调地址是公网可访问的，任何一台服务器都可以对其发起回调，如何确认回调是来自七牛的呢？

七牛在发起回调请求时会在请求头中带上 `Authorization` 字段，

    
    
    Authorization:QBox iN7NgwM31j4-BZacMjPrOQBs34UG1maYCAQmhdCV:tDK-3f5xF3SJYEAwsll5g= 
    

其中 QBox 为固定值，iN7Ngw...dCV 为用户的 Accesskey，tDK-3f...5g= 为签名结果 encoded_data。

业务服务器可以通过多种方法来对其进行验证， 例如如下面的代码php来进行验证：

    
    
        <?php
          require_once __DIR__ . '/../autoload.php';
          use Qiniu\Auth;
          $accessKey = getenv('QINIU_ACCESS_KEY');
          $secretKey = getenv('QINIU_SECRET_KEY');
          $bucket = getenv('QINIU_TEST_BUCKET');
          $auth = new Auth($accessKey, $secretKey);
          //获取回调的body信息
          $callbackBody = file_get_contents('php://input');
          //回调的contentType
          $contentType = 'application/x-www-form-urlencoded';
          //回调的签名信息，可以验证该回调是否来自存储服务
          $authorization = $_SERVER['HTTP_AUTHORIZATION'];
          //回调url
          $url = 'http://172.30.251.210/upload_verify_callback.php';
          $isQiniuCallback = $auth->verifyCallback($contentType, $authorization, $url, $callbackBody);
          if ($isQiniuCallback) {
              $resp = array('ret' => 'success');
          } else {
              $resp = array('ret' => 'failed');
          }
          echo json_encode($resp);
    

# 回调常见错误

## 1、400错误

这个是上传时表单格式错误，例如 `callbackbody` 设置的格式有问题等

## 2、579错误

1、上传成功回调失败，可以自己先用curl来验证callbackurl是否能成功响应200

    
    
    curl -X POST -d "name=123.jpg" http://url  
    

2、业务服务器返回给七牛的 body 不是合法的 json 串  
报错信息：`{"error":"unexcepted response"}`  
这时可通过抓包，获取七牛返回给客户端的 body ，通过 <http://jsonlint.com> 验证是否回调的 body 为合法的 json 串

3、业务服务器拒绝七牛的回调请求  
解决方案是配置允许七牛的回调UA的访问。 七牛回调UA：qiniu-callback/1.0

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  从生成的 token 解析上传策略

最近更新时间: 2017-08-22 16:53:50

**token 示例：**

    
    
    JmTcjiVWsoRxql3OA2krgoW-Fu9bzBZZGCd2lXem:hnuOE5rHuQjyfTIBTH06IaFY0ME=:eyJzY29wZSI6ImF0ZXN0IiwiZGVhZGxpbmUiOjE1MDY5Mzg5NDF9
    

**token 字符串分为三段，以“：”分割，base64解码第二个”：“后的字符串，可以查看设置的上传策略，如下：**

    
    
     base64 -D <<< eyJzY29wZSI6ImF0ZXN0IiwiZGVhZGxpbmUiOjE1MDY5Mzg5NDF9
    {"scope":"atest","deadline":1506938941}
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  视频教程--命令行工具使用

最近更新时间: 2021-02-22 17:05:28

### qshell 工具使用教程

[qshell mac & linux __](https://dn-odum9helk.qbox.me/spjc/7.mp4)

[qshell windows __](https://dn-odum9helk.qbox.me/spjc/qshell-win.mp4)

  

### qrsctl 工具使用教程

[qrsctl mac & linux __](https://dn-
odum9helk.qbox.me/spjc/avthumb/qrsctl.mov.mp4)

[qrsctl windows __](https://dn-odum9helk.qbox.me/spjc/qrsctl-win.mp4)

  

### qfetch 工具使用教程

[qfetch mac & linux __](https://dn-
odum9helk.qbox.me/spjc/avthumb/qfetch.mov.mp4)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传 403 错误码

最近更新时间: 2018-01-04 17:24:57

#### 1.putPolicy中bucket:key与上传方法中的key不同，报错：

`{"error":"key doesn't match with scope"}`

Example：

java-sdk为例:

    
    
    String token = auth.uploadToken("qiniu-java-demo", "test",3600,null,true);//（生成token代码）
    Response r = uploadManager.put(file, "test.txt", token,null,null, true);//（上传代码段）
    

因为test和test.txt不匹配，所以报错。auth.uploadToken中指定的key和uploadManager.put中设置的key值不同导致403

#### 2.putPolicy中设置了limited mimeType,报错：

`{"error":"limited mimeType: this file type is forbidden to upload"}`

#### Example：

java-sdk:

    
    
    String token = auth.uploadToken("qiniu-java-demo", "test",3600,new StringMap().put("mimeLimit", "image/*"),true);
    Response r = uploadManager.put(file, "test.txt", token,null,null, true);
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传慢如何诊断？

最近更新时间: 2022-11-29 15:45:24

# 解决思路

为了可以快速定位问题，需要用提供有问题用户的网络信息或截图 通过 [提交工单
__](https://support.qiniu.com/question)发给我们 来帮助排查。

# 解决方法

需要提供问题用户提供如下内容

### 1\. 上传下载带宽信息

打开 [本地网络带宽测试 __](http://www.bandwidthplace.com/)点击 start 获取

### 2\. 用户本地网络信息

打开 [问题诊断系统 __](http://ping.huatuo.qq.com)稍等片刻后会显示诊断结果

### 3\. 用户上传速度检测

打开 [七牛云上传速度检测 __](https://kodo-utils.qiniu.com/upload-
test)根据不同的上传空间区域选择指定的区域测试

注:

  * 服务端上传测试 `up`
  * 客户端上传测试 `upload`
  * https 上传测试 `qiniup.com` 的域名

例如：上传空间为华东，协议为https，点击开始测试  
  
  
![image.png](https://dn-odum9helk.qbox.me/FrG3WpfnXEBPpUSJJDIA-k9Xpn5m)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  在七牛云存储上播放 HLS

最近更新时间: 2017-08-30 18:47:38

# 在七牛云存储上播放 HLS

HLS 是在移动端使用广泛的播放协议，可以用于直播，也可以用于点播。七牛云存储提供多种类型的视频文件向 HLS
的转换功能：[音视频切片](http://developer.qiniu.com/docs/v6/api/reference/fop/av/segtime.html)。同时，也提供了
m3u8 和 ts 文件的分发下载功能。

用户有两种方式使用七牛云存储提供的 HLS 功能。如果用户已经有视频的 m3u8 文件和相应的 ts 文件，那么只需上传到七牛云存储中即可。播放时将
m3u8 文件的[下载
url](http://developer.qiniu.com/docs/v6/api/overview/dn/download.html)
作为播放地址，便可以播放 HLS 视频。但有两点需要注意：

1,m3u8 文件中，必须指向 ts 文件所在的位置。包括两种形态：相对引用和绝对引用。相对引用就是当 m3u8 文件同 ts 文件在同一 bucket
中时，可以直接将 ts 文件名放在 m3u8 文件中，不需要额外的前缀：

    
    
    #EXTM3U
        #EXT-X-VERSION:3
        #EXT-X-MEDIA-SEQUENCE:0
        #EXT-X-ALLOW-CACHE:NO
        #EXT-X-TARGETDURATION:300
        #EXTINF:300.000,
        seg00000.ts
        #EXTINF:300.000,
        seg00001.ts
        #EXTINF:300.000,
        seg00002.ts
        #EXTINF:300.000,
        seg00003.ts
        #EXTINF:300.000,
        seg00004.ts
        #EXT-X-ENDLIST
    

对于 m3u8 文件同 ts 文件放在不同的 bucket 的情况，需要在 ts 文件名之前增加域名前缀：

    
    
    #EXTM3U
        #EXT-X-VERSION:3
        #EXT-X-MEDIA-SEQUENCE:0
        #EXT-X-ALLOW-CACHE:NO
        #EXT-X-TARGETDURATION:300
        #EXTINF:300.000,
        http://test-hls.u.qiniudn.com/seg00000.ts
        #EXTINF:300.000,
        http://test-hls.u.qiniudn.com/seg00001.ts
        #EXTINF:300.000,
        http://test-hls.u.qiniudn.com/seg00002.ts
        #EXTINF:300.000,
        http://test-hls.u.qiniudn.com/seg00003.ts
        #EXTINF:300.000,
        http://test-hls.u.qiniudn.com/seg00004.ts
        #EXT-X-ENDLIST
    

2,为了保证 flash 播放器能够正确播放 HLS 视频，必须在 m3u8 和 ts 文件所在的 bucket 中放置 crossdomain.xml
文件。

如果用户所用的是其他类型的视频格式，比如 MP4、FLV
等，可以上传至七牛云存储，然后使用七牛云存储的[音视频切片](http://developer.qiniu.com/docs/v6/api/reference/fop/av/segtime.html)功能，将其转化成
HLS
视频。用户可以在视频上传的同时启动转换操作：[数据预处理](http://developer.qiniu.com/article/developer/security/put-
policy.html#put-policy-persistent-ops-
explanation)，也可以对已经上传的视频文件进行转换：[触发持久化处理](http://developer.qiniu.com/docs/v6/api/reference/fop/pfop/pfop.html)。

在启动 HLS 转换操作时，需要指定视频切片的长度。这个值过长会造成拖放响应降低，废流量增加；这个值过短，会造成 ts 文件过多，管理不便。通常，ts
文件片的长度取 5 分钟到 10 分钟比较合适。

有的用户希望将 m3u8 和 ts 文件所在的 bucket 置为私有，以保护视频内容。但是，一旦 bucket 置为私有，那么对 ts
文件的访问必须每次都进行授权，从而导致每次访问的 url 都不一样，进而使得每次播放都需要生成不同的 m3u8 文件。为解决这个问题，七牛云存储提供了[私有
m3u8
功能](http://developer.qiniu.com/docs/v6/api/reference/fop/av/pm3u8.html)。用户借助此功能，可以直接访问一个私有
bucket 中的 HLS 视频。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  如何将线上的数据热迁移到七牛云？

最近更新时间: 2019-02-14 12:04:33

> 想将线上的数据迁移到七牛云，如何在不影响现有服务的前提下进行热迁移？

## 方案一：完全使用七牛镜像存储功能

**注意：此方法仅针对少量数据的网站，对于数据量比较大（尤其是 UGC -- 用户产生内容）的网站，建议用下面的方案二**

利用七牛提供的镜像存储功能，可以非常简单地将源站的数据 **被动** 地同步到七牛云存储中，所谓 **被动同步**
即——只有在资源被访问时，七牛才会回源站获取一次，此后对该资源的访问都不会再发生回源动作，而是直接从七牛这里拿到数据。

有人可能会问，既然七牛对一个资源只会发生一次回源请求，后面的都不回源获取，那么如果源站的资源发生了变动，该如何将新的资源同步到七牛？这里我们提供两个方案：

  1. 调用七牛提供的 `delete` 接口，将变化的资源删除既可。这样七牛在下一次被访问的时候，会再次回源获取。如果资源变动数量很小，可以更加简单地在开发者后台的内容管理中，或者使用七牛提供的 qboxrsctl 命令行工具直接删除已变化的文件既可。

  2. 调用七牛提供的 `prefetch` 接口，该接口会比 `delete` 接口多做一个 **预取** 的操作，即在该接口调用时，七牛会立刻回源获取一次新的数据，而不是等到下一次访问的时候才去源站获取。

PS：

  1. 登录[开发者后台](http://portal.qiniu.com/)开启镜像存储功能

  2. qrsctl 工具获取方式：[http://developer.qiniu.com/docs/v6/tools/qboxrsctl.html#download](http://developer.qiniu.com/code/v6/tool/qrsctl.html)

  3. `delete` 接口[相关文档](http://developer.qiniu.com/docs/v6/api/reference/rs/delete.html)

  4. `prefetch` 接口[相关文档](http://developer.qiniu.com/docs/v6/api/reference/rs/prefetch.html)

## 方案二：七牛镜像存储功能 + 一套迁移方案

方案一适用于将源站保留的前提下进行数据的热迁移，同时享受到七牛提供的加速和数据处理服务。如果您想将源站的数据完全一下子迁移到七牛，而源站的数据量又十分庞大，担心在数据迁移的过程中出现源站的资源被动态更新，但导入到七牛的数据还是老数据的情况，那么可以使用如下的数据迁移方案。

如何在不影响现有服务的前提下，将源站的数据完整地迁移到七牛呢？我们提供一套成熟的迁移方案供您参考：

  1. 第一步，开启镜像存储，并将用户对源站资源的访问切换到从七牛这里访问，同时在源站保持使用 `prefetch` 接口预取更新变化了的资源。

  2. 第二步，将资源的上传动作从源站切换到七牛，这样用户对资源的修改动作会直接更新七牛中存储的内容，此时源站的资源数据已经变成一个静态的集合，因此可以撤销第一步中对 `prefetch` 接口的使用。

  3. 第三步，放心地将源站的静态资源数据增量地导入七牛的存储，存储中已有的资源不再导入，只导入存储中还不存在的资源。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  上传报400：incorrect region, please use xxxx.qiniu.com

最近更新时间: 2017-08-22 15:35:33

上传的时候，如果遇到类似400：incorrect region, please use
xxx.qiniu.com的错误，说明是上传域名和空间所在的区域不匹配，多发生在旧的sdk、工具和插件上。后面的
xxx.qiniu.com是正确的上传域名。

存储区域和上传域名的对应关系见<https://developer.qiniu.com/kodo/manual/1671/region-endpoint>

出现这种情况，如果是使用的第三方插件，需要更新插件或询问第三方开发人员；如果是使用sdk，可以更新成最新的sdk，如果是使用七牛提供的工具，需要你更新为最新版本的qshell工具

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  批量获取下载外链的方法

最近更新时间: 2017-09-21 16:35:26

批量获取下载外链，可以先列举出空间中的文件 key ，然后在 key 前拼接域名。具体方法：

  1. 使用 [qshell](https://developer.qiniu.com/kodo/tools/1302/qshell) 工具的 [listbucket](https://github.com/qiniu/qshell/blob/master/docs/listbucket.md) 命令，列举出空间文件列表。输出结果示例： 
    
        hello.jpg    1710619    FlUqUK7zqbqm3NPwzq2q7TMZ-Ijs    14209629320769140    image/jpeg  1  
    hello.mp4    8495868    lns2dAHvO0qYseZFgDn3UqZlMOi-    14207312835630132    video/mp4   0  
    hhh    1492031    FjiRl_U0AeSsVCHXscCGObKyMy8f    14200176147531840    image/jpeg  1  
    jemygraw.jpg    1900176    FtmHAbztWfPEqPMv4t4vMNRYMETK    14208960018750329    application/octet-stream    1   QiniuAndroid
    

  2. 过滤出第一列的 key ，并拼接域名。实现方法有很多，下面介绍一种：  
在 linux 或 macOS 终端，执行如下命令：

    
        $ cat fileList.txt | awk -F ' ' ' {print "http://domain/"$1}' > urlList.txt
    

urlList.txt 的输出结果：

    
        http://domain/hello.jpg  
    http://domain/hello.mp4  
    http://domain/hhh  
    http://domain/jemygraw.jpg
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  批量下载与空间备份

最近更新时间: 2017-08-30 17:43:45

您好，批量下载，空间备份可以通过以下两种方式实现：

1.调用list接口，遍历空间，获得空间内的文件信息，然后下载。代码逻辑是先调用list接口获得文件名的集合，再与空间域名拼接成url，循环调用download方法下载文件。  
<https://developer.qiniu.com/kodo/api/1284/list>  
<https://developer.qiniu.com/kodo/manual/1232/download-process>

以python为例：

    
    
    # -*- coding: utf-8 -*-
    from qiniu import Auth
    from qiniu import BucketManager
    import requests
    import os
    
    access_key = ''
    secret_key = ''
    
    q = Auth(access_key, secret_key)
    bucket = BucketManager(q)
    
    bucket_name = 'your_bucket_name'
    # 前缀
    prefix = None
    # 列举条目
    limit = 200
    # 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
    delimiter = None
    # 标记
    marker = None
    
    path = '/somedir/'
    
    ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
    for i in ret['items']:
        print(i['key'])
        base_url = 'your_bucket_domain/'+i['key']
        print(base_url)
    
        #如果空间有时间戳防盗链或是私有空间，可以调用该方法生成私有链接
        private_url = q.private_download_url(base_url, expires=100)
        print(private_url)
    
        r = requests.get(private_url)
    
        if r.content:
            if not os.path.exists(path):
                os.makedirs(path)
            file = open(path + i['key'], "wb")
            file.write(r.content)
            file.flush()
            file.close()
    

2.下载备份工具：

<http://developer.qiniu.com/docs/v6/tools/qshell.html> 使用qdownload命令

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  通过webuploader实现上传

最近更新时间: 2017-08-27 10:14:53

### **简介**

七牛官方的js
sdk是基于plupload开发的，考虑到webuploader也是一个比较流行的上传组件，本文提供一个使用webuploader上传文件至七牛的示例  
  

### **github地址**

<https://github.com/GuGaobai1994/webuploader-qiniu>  
  

### **使用方法**

可以clone github中的代码，打开demo.html看到简单的页面  
<https://github.com/GuGaobai1994/webuploader-qiniu/blob/master/demo.html>  
初始化时需要填入几个关键参数

    
    
        var options = {
            host : "http://upload.qiniu.com",
            tokenUrl : "http://localhost:8083/uptoken",
            domain : "http://orqjqg7zj.bkt.clouddn.com/",
            mockToken : true,
            mockTokenValue : "FMVCRs2-LO1ivRNi4l7mEZE6ZDvPv-519D12kZCO:ZXOlC4-SKwZfalWNIvXUNUZg1wA=:eyJzY29wZSI6InJ0Y3Rlc3QiLCJkZWFkbGluZSI6MjUwMjY5NjAxNH0=",
            hash : true
        }
    

  
  
host: 上传空间对应的上传地址，建议使用客户端上传地址，参考
<https://developer.qiniu.com/kodo/manual/1671/region-endpoint>

tokenUrl: 获取上传token的地址

domain: 空间对应域名

hash: 是否使用hash值作为空间内文件名  
  

### **初始化代码**

参考 <https://github.com/GuGaobai1994/webuploader-qiniu/blob/master/main.js>

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  如何批量删除空间里的文件

最近更新时间: 2017-08-30 17:44:22

### 1.调用两个接口写代码循环删除

可以先调用list接口，返回如下的的json信息

![](https://dn-odum9helk.qbox.me/FnVnJeHQKCh4cL_ODOqR5OLJ8acU)

然后循环调用delete接口一一删除

<https://developer.qiniu.com/kodo/api/1284/list>

<https://developer.qiniu.com/kodo/api/1257/delete>

  
以python为例：

    
    
    # -*- coding: utf-8 -*-
    from qiniu import Auth
    from qiniu import BucketManager
    
    access_key = ''
    secret_key = ''
    
    q = Auth(access_key, secret_key)
    bucket = BucketManager(q)
    
    bucket_name = ''
    # 前缀
    prefix = None
    # 列举条目
    limit = 200
    # 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
    delimiter = None
    # 标记
    marker = None
    
    ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
    for i in ret['items']:
        print(i['key'])
        ret, info = bucket.delete(bucket_name, i['key'])
    

  

### 2.使用qshell的batchdelete和listbucket命令

<https://developer.qiniu.com/kodo/tools/1302/qshell>  

### 3.使用batch批量操作

<https://developer.qiniu.com/kodo/api/1250/batch>

以python为例：

    
    
    # -*- coding: utf-8 -*-
    
    from qiniu import Auth
    from qiniu import BucketManager, build_batch_delete
    
    access_key = ''
    secret_key = ''
    
    # 初始化Auth状态
    q = Auth(access_key, secret_key)
    
    # 初始化BucketManager
    bucket = BucketManager(q)
    
    keys = {'2.png':'2.png', '3.png':'3.png'}
    
    ops = build_batch_delete('your_bucket_name', keys)
    
    ret, info = bucket.batch(ops)
    print(ret)
    print(info)
    

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  浏览器对 MP4 的支持

最近更新时间: 2019-01-04 17:45:19

# 浏览器的支持表

[参照如下文档](https://en.wikipedia.org/wiki/HTML5_video)

# MP4 视频格式解释

MP4有非常复杂的含义（ 见 <http://en.wikipedia.org/wiki/Mp4> ），普通人对MP4的理解是后缀为 `.mp4`
的文件。但 MP4 本身不是一种简单的视频格式，它是一个包装了视频和音频格式的容器。至于里面的视频和音频使用什么编码是可选的。MP4的视频格式可以使用
DivX 也可使用 H264，vp8，vp9，theora。

# 推荐浏览器

Chrome浏览器支持 HTML5 ，它支持原生播放部分的 MP4 格式（不用通过 Flash 等插件）

# 遇到的问题

为什么是部分MP4呢？是因为 Chrome 只支持 H264。为什么 Chrome
不支持所有的视频编码格式？绝大部份的视频编码格式都是要付专利费的，Google 已经为 H264 买了单，Firefox 没有 Google
那么有钱不愿意买。

# 查看视频格式

在外链地址后面加上 `?avinfo`，如： <http://dn-odum9helk.qbox.me/mp4-v1?avinfo>

这是可以在chrome中正常播放的：

    
    
    "streams": [
            {
                "index": 0,
                "codec_name": "h264",
                "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
    

这个格式就是不OK的：

    
    
    "streams": [
            {
                "index": 0,
                "codec_name": "mpeg4",
                "codec_long_name": "MPEG-4 part 2",
    

# 播放效果

[可以播放的视频演示](http://dn-
odum9helk.qbox.me/@/test/mp4-test1%20-%20%E5%89%AF%E6%9C%AC.html)

[不可以播放的视频效果](http://dn-odum9helk.qbox.me/@/test/mp4-test1.html)

# 解决方案

  1. 使用js或者flash播放器来播放 针对部分格式，即使是播放器也不行。还是建议使用七牛的转码。
  2. 使用七牛的异步转码服务。
  3. 转码前，利用部分的播放器也播放不了。原视频：<http://dn-odum9helk.qbox.me/mpeg4.mp4>
  4. 转码后：<http://dn-odum9helk.qbox.me/mpeg4-zhuanma.mp4>

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  视频教程 - 基本使用

最近更新时间: 2019-01-04 17:46:18

全局使用:

<http://dn-odum9helk.qbox.me/spjc/1.mp4>

创建空间讲解

<http://dn-odum9helk.qbox.me/spjc/2.mp4>

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  base64 上传自定义回调

最近更新时间: 2018-11-21 19:01:01

#### Base64 上传自定义回调数据

Base64上传详见<https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-
seven-niuyun-base64-code。>  
  
这里讲一下x:user-var这个参数的使用  
  
首先需要在生成上传token时指定 saveKey 或者 callbackBody
这类支持自定义变量或者魔法变量的参数，一般通过服务器端生成。以在生成token是指定上传策略时，指定saveKey:name=$(x:extension)。  
生成的token为  
FMVCRs2-LO1ivRNi4l7mEZE6ZDvPv-519D12kZCO:RbsOpgGA6p_aJlXHYOvAuBt2fvc=:eyJzYXZlS2V5IjoibmFtZVx1MDAzZCQoeDpleHRlbnNpb24pIiwic2NvcGUiOiJodG1sIiwiZGVhZGxpbmUiOjE0OTg0NDE1NDl9  

#### 通过base64解码上传策略部分

eyJzYXZlS2V5IjoibmFtZVx1MDAzZCQoeDpleHRlbnNpb24pIiwic2NvcGUiOiJodG1sIiwiZGVhZGxpbmUiOjE0OTg0NDE1NDl9  
  
{"saveKey":"name\u003d$(x:extension)","scope":"html","deadline":1498441549}

#### 在上传url中指定x:extension参数

上传url: <http://up-z2.qiniup.com/putb64/-1/x:extension/dGVzdA==>  
![](https://dn-odum9helk.qbox.me/FmFKB0XUTqSVP3CO-7GVbSYnOROS)

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  特殊key资源的访问

最近更新时间: 2017-04-20 12:27:46

> 文件key为`/log.jpg`,为什么访问不了？

## 概要

一般情况下，访问公有资源可以通过以下形式的url:

    
    
    http://<domain>/<key>
    

例如:

    
    
    http://qiniuphotos.qiniudn.com/gogopher.jpg
    

基于此种简单规则的url在实际应用中非常方便。七牛云存储对key的格式几乎没有限制，因此任何可打印字符皆可作为资源的key。但是,如果key中包含特殊字符，如首字符为`/`、两个连接以上的`/`、以及`?`等，则无法通过上面形式的url在浏览器中进行访问。产生此类key的来源主要有：

  1. 使用 sdk 上传文件
  2. 使用 qboxrsctl put 上传

> **注：采用qrsync工具时不会产生此类key**

这里强调了两点，一是key中包含了特殊字符，二是通过浏览器访问文件。
这是因为浏览器对这些符号是保留使用的，例如：`/`用于分隔目录，`?`用于分隔Url和查询，多个连续的`/`会被处理为一个等等。
对于这类key,需要对其进行转义，其方法为：

将特殊字符转换成 ASCII码，格式为：%加字符的 ASCII码，即一个百分号 %，后面跟对应字符的 ASCII（16进制）码值。例如 空格的编码值是
%20。

## 示例

下面4个资源：

  * 资源1，`key:hello%2Fqiniu.jpg`
  * 资源2，`key:hello/qiniu.jpg`
  * 资源3，`key:hello?qiniu.jpg`
  * 资源4，`key:/hello/qiniu2.jpg`

对于资源 1 和 2，无论在浏览器中输入下面的哪种形式的 url，最终访问到的是资源 2

    
    
    http://test.qiniudn.com/hello%2Fqiniu.jpg
    

或

    
    
    http://test.qiniudn.com/hello/qiniu.jpg
    

对于资源4，如果在浏览器中输入`http://test.qiniudn.com//hello/qiniu2.jpg`，浏览器中将会显示:
`{"error":"E404"}`，说明这个资源不存在

## 解决方案

对于示例中的资源 1 和 3，可分别通过下面的 url 进行访问：

    
    
    http://test.qiniudn.com/hello%252Fqiniu.jpg
    
    http://test.qiniudn.com/hello%3Fqiniu.jpg
    

多数情况下不需要手工对 url 进行转换，例如php语言，可以调用 urlencode 方法对 key 进行编码，其它语言类似。

    
    
    <?php
        echo "http://test.qiniudn.com/".urlencode("hello%2Fqiniu.jpg")
        echo "http://test.qiniudn.com/".urlencode("hello?qiniu.jpg")
    ?>
    

对于示例中的资源4，上面的解决方法失效。需要通过下面的url访问：

    
    
    http://test.qiniudn.com/@/hello/qiniu2.jpg
    

具体的编码算法如下：

    
    
    func qiniuescape(key string) string 
    {  
       needesc := true 
       for i, ch := range key {  
           if ch == '/' && needesc {
             //转义为 "@/"     
           } else if ch == '@' && needesc {
             //转义为 "@@"
           }
           needesc = (ch == '/')
       }
    }
    

> **如无特殊需求，建议开发者避免使用以上提到的特殊key**

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  如何利用七牛云存储实现 HLS 的多码率播放

最近更新时间: 2017-08-30 18:49:06

当前的音视频应用必须面对各种不同的播放客户端，从 PC
端（Web）开始，到智能手机。这些播放客户端有不同的尺寸，因而需要不同的分辨率。视频不同的客户端也会有不同的网络环境，比如 PC 上通常都有 WiFi
或有线网络，有较高的带宽保证，而手机、平板电脑在室外时，使用 2G/3G 网络，往往带宽不足，或者不稳定。因而需要针对不同的网络环境采用不同的码率。

HLS 本身所具备的的多码率播放能力对于音视频应用而言，提供了很大的方便。

用户首先根据需要生成不同分辨率和码率的 HLS 视频，（生成的方法参考[在七牛云存储上播放
HLS](https://developer.qiniu.com/kodo/kb/1339)）。这些不同分辨率的 HLS 视频都应当存放在同一个
bucket 中。然后构造出多码率的 m3u8 文件：

    
    
    #EXTM3U
        #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=15000000
        http://test-hls.u.qiniudn.com/ultra-high.m3u8
        #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=10000000
        http://test-hls.u.qiniudn.com/high.m3u8
        #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5000000
        http://test-hls.u.qiniudn.com/standard.m3u8
        #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2500000
        http://test-hls.u.qiniudn.com/low.m3u8
    

其中，ultra-high.m3u8、high.m3u8、standard.m3u8、low.m3u8 分别是已经生成的各种分辨率和码率的 HLS 视频。

用户生成这个文件后，可以将其上传至 bucket，供以后使用。

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交
#  镜像存储功能在源站 URL 含有问号时的抓取资源规则

最近更新时间: 2018-01-05 10:02:16

镜像存储功能在 [镜像存储与qrsync数据同步的使用](https://developer.qiniu.com/kodo/kb/1345/the-
combination-of-image-storage-and-qrsync-tool-data-migration-plan)
中已有介绍。在使用镜像存储的时候，七牛会回源站拉取文件，如果源 URL 中带有问号，资源会按照如下规则来抓取和存储：

1， 如果源站的 URL
是类似这样的：`http://example.com/a/b/c/d.txt?version=20130807`，那么镜像存储会将文件 `d.txt`
抓取过来，并在七牛保存为`a/b/c/d.txt` (在七牛云存储中称为 `key`)，忽略问号后面的参数。

2，如果源站的 URL 是类似这样的：`http://example.com/?version=20130807`，那么镜像存储会将访问该 URL
得到的结果保存在七牛云存储，但是保存的 key 为空的 key 值（不是不存在）。

3，如果源站的url是这样：`http://example.com/xxx.js?v=12222333332`，如果存在xxx.js这个文件，并且问号后面不同的版本号对应不同的文件，那么在抓取文件时，需要将？进行url编码后才可以正常拉取

以上内容是否对您有帮助？

* __
* __
* __
* __
* __

文档反馈 (如有产品使用问题，请[ 提交工单](https://support.qiniu.com/tickets/category))

提交