122 changed files with 7813 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||||
|
*.phar |
||||
|
*.zip |
||||
|
build/artifacts |
||||
|
phpunit.xml |
||||
|
phpunit.functional.xml |
||||
|
.DS_Store |
||||
|
.swp |
||||
|
.build |
||||
|
composer.lock |
||||
|
vendor |
||||
|
src/package.xml |
||||
|
.idea/ |
||||
@ -0,0 +1,35 @@ |
|||||
|
filter: |
||||
|
excluded_paths: [tests/*] |
||||
|
checks: |
||||
|
php: |
||||
|
code_rating: true |
||||
|
remove_extra_empty_lines: true |
||||
|
remove_php_closing_tag: true |
||||
|
remove_trailing_whitespace: true |
||||
|
fix_use_statements: |
||||
|
remove_unused: true |
||||
|
preserve_multiple: false |
||||
|
preserve_blanklines: true |
||||
|
order_alphabetically: true |
||||
|
fix_php_opening_tag: true |
||||
|
fix_linefeed: true |
||||
|
fix_line_ending: true |
||||
|
fix_identation_4spaces: true |
||||
|
fix_doc_comments: true |
||||
|
tools: |
||||
|
external_code_coverage: |
||||
|
timeout: 1200 |
||||
|
runs: 3 |
||||
|
php_analyzer: true |
||||
|
php_code_coverage: false |
||||
|
php_code_sniffer: |
||||
|
config: |
||||
|
standard: PSR2 |
||||
|
filter: |
||||
|
paths: ['src'] |
||||
|
php_loc: |
||||
|
enabled: true |
||||
|
excluded_dirs: [vendor, tests] |
||||
|
php_cpd: |
||||
|
enabled: true |
||||
|
excluded_dirs: [vendor, tests] |
||||
@ -0,0 +1,30 @@ |
|||||
|
sudo: false |
||||
|
language: php |
||||
|
|
||||
|
php: |
||||
|
- 5.4 |
||||
|
- 5.5 |
||||
|
- 5.6 |
||||
|
- 7.0 |
||||
|
|
||||
|
dist: trusty |
||||
|
|
||||
|
before_script: |
||||
|
- export QINIU_TEST_ENV="travis" |
||||
|
- travis_retry composer self-update |
||||
|
- travis_retry composer install --no-interaction --prefer-source --dev |
||||
|
|
||||
|
script: |
||||
|
- ./vendor/bin/phpcs --standard=PSR2 src |
||||
|
- ./vendor/bin/phpcs --standard=PSR2 examples |
||||
|
- ./vendor/bin/phpcs --standard=PSR2 tests |
||||
|
- ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover tests/Qiniu/Tests/ |
||||
|
|
||||
|
after_script: |
||||
|
- wget https://scrutinizer-ci.com/ocular.phar |
||||
|
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover |
||||
|
|
||||
|
env: |
||||
|
global: |
||||
|
- secure: "V9BsntXQZwvO9EOD6itzaae2uq+GemzyTUTxMTJx1/jFoUNpCU2O2UAgjA2XSEr5sgci0KWDV4Krbzv3EBB4uplOFLMI3w32256UHbT9E0x3YjhfPJZk68MH1iS1be7X81LDHON7yveavK8987s3qzjeUcbfLSPgccT+cvf7+dc=" |
||||
|
- QINIU_ACCESS_KEY=vHg2e7nOh7Jsucv2Azr5FH6omPgX22zoJRWa0FN5 |
||||
@ -0,0 +1,105 @@ |
|||||
|
# Changelog |
||||
|
|
||||
|
## 7.2.7 (2018-11-06) |
||||
|
* 添加 QVM 内网上传到 KODO 的 zone 设置 |
||||
|
|
||||
|
## 7.2.6 (2018-05-18) |
||||
|
* 修复rs,rsf在不同机房默认的https域名 |
||||
|
|
||||
|
## 7.2.5 (2018-05-10) |
||||
|
* 修复表单上传中多余的参数checkCrc导致的fname错位问题 |
||||
|
|
||||
|
## 7.2.4 (2018-05-09) |
||||
|
### 增加 |
||||
|
* 连麦功能 |
||||
|
|
||||
|
## 7.2.3 (2018-01-20) |
||||
|
### 增加 |
||||
|
* 新加坡机房 |
||||
|
### 修正 |
||||
|
* 获取域名的入口域名 |
||||
|
* http回复头部兼容大小写 |
||||
|
|
||||
|
## 7.2.2 (2017-11-06) |
||||
|
### 增加 |
||||
|
* Qiniu算法的鉴权方法 |
||||
|
|
||||
|
## 7.1.4 (2017-06-21) |
||||
|
### 增加 |
||||
|
* cdn 文件/目录 刷新 |
||||
|
* cdn 获取 流量/带宽 |
||||
|
* cdn 获取域名的访问日志列表 |
||||
|
* cdn 对资源链接进行时间戳防盗链签名 |
||||
|
|
||||
|
## 7.1.3 (2016-11-18) |
||||
|
### 增加 |
||||
|
* move, copy操作增加force参数 |
||||
|
|
||||
|
## 7.1.2 (2016-11-12) |
||||
|
### 修正 |
||||
|
* 明确抛出获取各区域域名失败时的报错 |
||||
|
|
||||
|
## 7.1.1 (2016-11-02) |
||||
|
### 修正 |
||||
|
* 多区域配置文件存储目录从home修改到tmp目录 |
||||
|
|
||||
|
|
||||
|
## 7.1.0 (2016-10-22) |
||||
|
### 增加 |
||||
|
* 多存储区域的支持 |
||||
|
|
||||
|
## 7.0.8 (2016-07-19) |
||||
|
### 增加 |
||||
|
* demo |
||||
|
* https url 支持 |
||||
|
* deleteAfterDays 策略 |
||||
|
* 添加图片处理链接统一拼接方法 by @SherlockRen |
||||
|
|
||||
|
## 7.0.7 (2016-01-12) |
||||
|
### 修正 |
||||
|
* PersistentFop参数pipeline和notify_url失效 |
||||
|
* resume 模式 close file inputstream |
||||
|
|
||||
|
## 7.0.6 (2015-12-05) |
||||
|
### 修正 |
||||
|
* php7.0 Json 对空字符串解析单元测试报错 |
||||
|
* 开启安全模式或者设置可操作目录树时,设置CURLOPT_FOLLOWLOCATION报错, by @twocabbages |
||||
|
* fetch 支持不指定key, by @sinkcup |
||||
|
|
||||
|
## 7.0.5 (2015-10-29) |
||||
|
### 增加 |
||||
|
* 增加上传策略最小文件大小限制 fsizeMin |
||||
|
* 增加常见examples |
||||
|
|
||||
|
## 7.0.4 (2015-07-23) |
||||
|
### 修正 |
||||
|
* 一些地方的严格比较检查 |
||||
|
* resumeupload 备用地址失效 |
||||
|
|
||||
|
## 7.0.3 (2015-07-10) |
||||
|
### 修改 |
||||
|
* 多zone 支持 |
||||
|
|
||||
|
## 7.0.2 (2015-04-18) |
||||
|
### 修改 |
||||
|
* fetch 接口返回内容调整 |
||||
|
* pfop 接口调整 |
||||
|
|
||||
|
###修正 |
||||
|
* exception 类调用 |
||||
|
|
||||
|
## 7.0.1 (2015-03-27) |
||||
|
### 增加 |
||||
|
* 增加代码注释 |
||||
|
|
||||
|
## 7.0.0 (2015-02-03) |
||||
|
|
||||
|
### 增加 |
||||
|
* 简化上传接口 |
||||
|
* 自动选择断点续上传还是直传 |
||||
|
* 重构代码,接口和内部结构更清晰 |
||||
|
* 改变mime |
||||
|
* 代码覆盖度报告 |
||||
|
* policy改为array, 便于灵活增加,并加入过期字段检查 |
||||
|
* 文件列表支持目录形式 |
||||
|
* 利用元编程方式支持 fop 和 pfop |
||||
@ -0,0 +1,30 @@ |
|||||
|
# 贡献代码指南 |
||||
|
|
||||
|
我们非常欢迎大家来贡献代码,我们会向贡献者致以最诚挚的敬意。 |
||||
|
|
||||
|
一般可以通过在Github上提交[Pull Request](https://github.com/qiniu/php-sdk)来贡献代码。 |
||||
|
|
||||
|
## Pull Request要求 |
||||
|
|
||||
|
- **[PSR-2 编码风格标准](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** 。要通过项目中的code sniffer检查。 |
||||
|
|
||||
|
- **代码格式** 提交前 请按 ./vendor/bin/phpcbf --standard=PSR2 进行格式化。 |
||||
|
|
||||
|
- **必须添加测试!** - 如果没有测试(单元测试、集成测试都可以),那么提交的补丁是不会通过的。 |
||||
|
|
||||
|
- **记得更新文档** - 保证`README.md`以及其他相关文档及时更新,和代码的变更保持一致性。 |
||||
|
|
||||
|
- **考虑我们的发布周期** - 我们的版本号会服从[SemVer v2.0.0](http://semver.org/),我们绝对不会随意变更对外的API。 |
||||
|
|
||||
|
- **创建feature分支** - 最好不要从你的master分支提交 pull request。 |
||||
|
|
||||
|
- **一个feature提交一个pull请求** - 如果你的代码变更了多个操作,那就提交多个pull请求吧。 |
||||
|
|
||||
|
- **清晰的commit历史** - 保证你的pull请求的每次commit操作都是有意义的。如果你开发中需要执行多次的即时commit操作,那么请把它们放到一起再提交pull请求。 |
||||
|
|
||||
|
## 运行测试 |
||||
|
|
||||
|
``` bash |
||||
|
./vendor/bin/phpunit tests/Qiniu/Tests/ |
||||
|
|
||||
|
``` |
||||
@ -0,0 +1,22 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) 2014 Qiniu, Ltd.<sdk@qiniu.com> |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
||||
|
|
||||
@ -0,0 +1,75 @@ |
|||||
|
# Qiniu Cloud SDK for PHP |
||||
|
[](http://doxygen.io/github.com/qiniu/php-sdk/) |
||||
|
[](LICENSE) |
||||
|
[](https://travis-ci.org/qiniu/php-sdk) |
||||
|
[](https://packagist.org/packages/qiniu/php-sdk) |
||||
|
[](https://packagist.org/packages/qiniu/php-sdk) |
||||
|
[](https://scrutinizer-ci.com/g/qiniu/php-sdk/?branch=master) |
||||
|
[](https://scrutinizer-ci.com/g/qiniu/php-sdk/?branch=master) |
||||
|
[](https://gitter.im/qiniu/php-sdk?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) |
||||
|
[](http://weibo.com/qiniutek) |
||||
|
|
||||
|
## 安装 |
||||
|
|
||||
|
* 通过composer,这是推荐的方式,可以使用composer.json 声明依赖,或者运行下面的命令。SDK 包已经放到这里 [`qiniu/php-sdk`][install-packagist] 。 |
||||
|
```bash |
||||
|
$ composer require qiniu/php-sdk |
||||
|
``` |
||||
|
* 直接下载安装,SDK 没有依赖其他第三方库,但需要参照 composer的autoloader,增加一个自己的autoloader程序。 |
||||
|
|
||||
|
## 运行环境 |
||||
|
|
||||
|
| Qiniu SDK版本 | PHP 版本 | |
||||
|
|:--------------------:|:---------------------------:| |
||||
|
| 7.x | cURL extension, 5.3 - 5.6,7.0 | |
||||
|
| 6.x | cURL extension, 5.2 - 5.6 | |
||||
|
|
||||
|
## 使用方法 |
||||
|
|
||||
|
### 上传 |
||||
|
```php |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
use Qiniu\Auth; |
||||
|
... |
||||
|
$upManager = new UploadManager(); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$token = $auth->uploadToken($bucketName); |
||||
|
list($ret, $error) = $upManager->put($token, 'formput', 'hello world'); |
||||
|
... |
||||
|
``` |
||||
|
|
||||
|
## 测试 |
||||
|
|
||||
|
``` bash |
||||
|
$ ./vendor/bin/phpunit tests/Qiniu/Tests/ |
||||
|
``` |
||||
|
|
||||
|
## 常见问题 |
||||
|
|
||||
|
- $error保留了请求响应的信息,失败情况下ret 为none, 将$error可以打印出来,提交给我们。 |
||||
|
- API 的使用 demo 可以参考 [单元测试](https://github.com/qiniu/php-sdk/blob/master/tests)。 |
||||
|
|
||||
|
## 代码贡献 |
||||
|
|
||||
|
详情参考[代码提交指南](https://github.com/qiniu/php-sdk/blob/master/CONTRIBUTING.md)。 |
||||
|
|
||||
|
## 贡献记录 |
||||
|
|
||||
|
- [所有贡献者](https://github.com/qiniu/php-sdk/contributors) |
||||
|
|
||||
|
## 联系我们 |
||||
|
|
||||
|
- 如果需要帮助,请提交工单(在portal右侧点击咨询和建议提交工单,或者直接向 support@qiniu.com 发送邮件) |
||||
|
- 如果有什么问题,可以到问答社区提问,[问答社区](http://qiniu.segmentfault.com/) |
||||
|
- 更详细的文档,见[官方文档站](http://developer.qiniu.com/) |
||||
|
- 如果发现了bug, 欢迎提交 [issue](https://github.com/qiniu/php-sdk/issues) |
||||
|
- 如果有功能需求,欢迎提交 [issue](https://github.com/qiniu/php-sdk/issues) |
||||
|
- 如果要提交代码,欢迎提交 pull request |
||||
|
- 欢迎关注我们的[微信](http://www.qiniu.com/#weixin) [微博](http://weibo.com/qiniutek),及时获取动态信息。 |
||||
|
|
||||
|
## 代码许可 |
||||
|
|
||||
|
The MIT License (MIT).详情见 [License文件](https://github.com/qiniu/php-sdk/blob/master/LICENSE). |
||||
|
|
||||
|
[packagist]: http://packagist.org |
||||
|
[install-packagist]: https://packagist.org/packages/qiniu/php-sdk |
||||
@ -0,0 +1,14 @@ |
|||||
|
<?php |
||||
|
|
||||
|
function classLoader($class) |
||||
|
{ |
||||
|
$path = str_replace('\\', DIRECTORY_SEPARATOR, $class); |
||||
|
$file = __DIR__ . '/src/' . $path . '.php'; |
||||
|
|
||||
|
if (file_exists($file)) { |
||||
|
require_once $file; |
||||
|
} |
||||
|
} |
||||
|
spl_autoload_register('classLoader'); |
||||
|
|
||||
|
require_once __DIR__ . '/src/Qiniu/functions.php'; |
||||
@ -0,0 +1,26 @@ |
|||||
|
{ |
||||
|
"name": "qiniu/php-sdk", |
||||
|
"type": "library", |
||||
|
"description": "Qiniu Resource (Cloud) Storage SDK for PHP", |
||||
|
"keywords": ["qiniu", "storage", "sdk", "cloud"], |
||||
|
"homepage": "http://developer.qiniu.com/", |
||||
|
"license": "MIT", |
||||
|
"authors": [ |
||||
|
{ |
||||
|
"name": "Qiniu", |
||||
|
"email": "sdk@qiniu.com", |
||||
|
"homepage": "http://www.qiniu.com" |
||||
|
} |
||||
|
], |
||||
|
"require": { |
||||
|
"php": ">=5.3.3" |
||||
|
}, |
||||
|
"require-dev": { |
||||
|
"phpunit/phpunit": "~4.0", |
||||
|
"squizlabs/php_codesniffer": "~2.3" |
||||
|
}, |
||||
|
"autoload": { |
||||
|
"psr-4": {"Qiniu\\": "src/Qiniu"}, |
||||
|
"files": ["src/Qiniu/functions.php"] |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,71 @@ |
|||||
|
# Rtc Streaming Cloud Server-Side Library For PHP |
||||
|
|
||||
|
## Features |
||||
|
|
||||
|
- Appclient |
||||
|
- [x] 创建房间: client->createApp() |
||||
|
- [x] 查看房间: client->getApp() |
||||
|
- [x] 删除房间: client->deleteApp() |
||||
|
- [x] 生成房间token: client->appToken() |
||||
|
|
||||
|
|
||||
|
|
||||
|
## Contents |
||||
|
|
||||
|
- [Installation](#installation) |
||||
|
- [Usage](#usage) |
||||
|
- [Configuration](#configuration) |
||||
|
- [App](#app) |
||||
|
- [Create a app](#create-a-app) |
||||
|
- [Get a app](#get-a-app) |
||||
|
- [Delete a app](#delete-a-app) |
||||
|
- [Generate a app token](#generate-a-app-token) |
||||
|
|
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
### App |
||||
|
|
||||
|
#### Create a app |
||||
|
|
||||
|
```php |
||||
|
$ak = "gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5"; |
||||
|
$sk = "xxxx"; |
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Rtc\AppClient($auth); |
||||
|
$resp=$client->createApp("901","testApp"); |
||||
|
print_r($resp); |
||||
|
``` |
||||
|
|
||||
|
#### Get an app |
||||
|
|
||||
|
```php |
||||
|
$ak = "gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5"; |
||||
|
$sk = "xxxx"; |
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Rtc\AppClient($auth); |
||||
|
$resp=$client->getApp("deq02uhb6"); |
||||
|
print_r($resp); |
||||
|
``` |
||||
|
|
||||
|
#### Delete an app |
||||
|
|
||||
|
```php |
||||
|
$ak = "gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5"; |
||||
|
$sk = "xxxx"; |
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Rtc\AppClient($auth); |
||||
|
$resp=$client->deleteApp("deq02uhb6"); |
||||
|
print_r($resp); |
||||
|
``` |
||||
|
|
||||
|
#### Generate an app token |
||||
|
|
||||
|
```php |
||||
|
$ak = "gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5"; |
||||
|
$sk = "xxxx"; |
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Rtc\AppClient($auth); |
||||
|
$resp=$client->appToken("deq02uhb6", "lfx", '1111', (time()+3600), 'user'); |
||||
|
print_r($resp); |
||||
|
``` |
||||
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
require_once("../../autoload.php"); |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$ak = 'gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5'; |
||||
|
$sk = 'xxxx'; |
||||
|
|
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Rtc\AppClient($auth); |
||||
|
$hub = 'lfxlive'; |
||||
|
$title = 'lfxl'; |
||||
|
try { |
||||
|
//创建app |
||||
|
$resp = $client->createApp($hub, $title, $maxUsers); |
||||
|
print_r($resp); |
||||
|
// 获取app状态 |
||||
|
$resp = $client->getApp('dgdl5ge8y'); |
||||
|
print_r($resp); |
||||
|
//修改app状态 |
||||
|
$mergePublishRtmp = null; |
||||
|
$mergePublishRtmp['enable'] = true; |
||||
|
$resp = $client->updateApp('dgdl5ge8y', $hub, $title, $maxUsers, $mergePublishRtmp); |
||||
|
print_r($resp); |
||||
|
//删除app |
||||
|
$resp = $client->deleteApp('dgdl5ge8y'); |
||||
|
print_r($resp); |
||||
|
//获取房间连麦的成员 |
||||
|
$resp=$client->listUser("dgbfvvzid", 'lfxl'); |
||||
|
print_r($resp); |
||||
|
//剔除房间的连麦成员 |
||||
|
$resp=$client->kickUser("dgbfvvzid", 'lfx', "qiniu-f6e07b78-4dc8-45fb-a701-a9e158abb8e6"); |
||||
|
print_r($resp); |
||||
|
// 列举房间 |
||||
|
$resp=$client->listActiveRooms("dgbfvvzid", 'lfx', null, null); |
||||
|
print_r($resp); |
||||
|
//鉴权的有效时间: 1个小时. |
||||
|
$resp = $client->appToken("dgd4vecde", "lfxl", '1111', (time()+3600), 'user'); |
||||
|
print_r($resp); |
||||
|
} catch (\Exception $e) { |
||||
|
echo "Error:", $e, "\n"; |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
<?php |
||||
|
require_once("../../autoload.php"); |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$ak="xxxx"; |
||||
|
$sk="xxxx"; |
||||
|
|
||||
|
$auth = new Auth($ak, $sk); |
||||
|
$client = new Qiniu\Sms\Sms($auth); |
||||
|
|
||||
|
//发送信息模块 |
||||
|
$template_id="1131792074274775040"; |
||||
|
$mobiles=array("18011111111","18011111111"); |
||||
|
$code = array('code' => 'code' ); |
||||
|
try { |
||||
|
//发送短信 |
||||
|
$resp = $client->sendMessage($template_id, $mobiles, $code); |
||||
|
print_r($resp); |
||||
|
} catch (\Exception $e) { |
||||
|
echo "Error:", $e, "\n"; |
||||
|
}exit; |
||||
|
//模板模块 |
||||
|
$name="tstest001"; |
||||
|
$template="tesy001 ${code}"; |
||||
|
$type="notification"; |
||||
|
$description="tstest001"; |
||||
|
$signature_id="1131464448834277376"; |
||||
|
$id="1131810682442883072"; |
||||
|
|
||||
|
try { |
||||
|
//创建模板 |
||||
|
$resp = $client->createTemplate($name, $template, $type, $description, $signature_id); |
||||
|
print_r($resp); |
||||
|
//查询模板 |
||||
|
$resp = $client->queryTemplate(); |
||||
|
print_r($resp); |
||||
|
//修改模板 |
||||
|
$resp = $client->updateTemplate($id, $name, $template, $description, $signature_id); |
||||
|
print_r($resp); |
||||
|
//删除模板 |
||||
|
$resp = $client->deleteTemplate($id); |
||||
|
print_r($resp); |
||||
|
} catch (\Exception $e) { |
||||
|
echo "Error:", $e, "\n"; |
||||
|
} |
||||
|
//签名模块 |
||||
|
$signature = 'lfxlive2'; |
||||
|
$source = 'enterprises_and_institutions'; |
||||
|
$pic="/Users/Desktop/sss.jpg"; |
||||
|
$audit_status="passed"; |
||||
|
$page=1; |
||||
|
$page_size=1; |
||||
|
$id="1131464448834277376"; |
||||
|
|
||||
|
try { |
||||
|
//创建签名 |
||||
|
$resp = $client->createSignature($signature, $source, $pic); |
||||
|
print_r($resp); |
||||
|
//查询签名 |
||||
|
$resp = $client->checkSignature($audit_status); |
||||
|
//修改签名 |
||||
|
$resp = $client->updateSignature($id, $signature, $source, $pic); |
||||
|
print_r($resp); |
||||
|
//删除ID |
||||
|
$resp = $client->deleteSignature($id); |
||||
|
print_r($resp); |
||||
|
} catch (\Exception $e) { |
||||
|
echo "Error:", $e, "\n"; |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
# examples |
||||
|
|
||||
|
这些 examples 旨在帮助你快速了解使用七牛的sdk。这些demo都是可以直接运行的, 但是在运行之前需要填上您自己的参数。 |
||||
|
|
||||
|
比如: |
||||
|
|
||||
|
* `$bucket` 需要填上您想操作的 [bucket名字](http://developer.qiniu.com/docs/v6/api/overview/concepts.html#bucket)。 |
||||
|
* `$accessKey` 和 `$secretKey` 可以在我们的[管理后台](https://portal.qiniu.com/setting/key)找到。 |
||||
|
* 在进行`视频转码`, `压缩文件`等异步操作时 需要使用到的队列名称也可以在我们[管理后台](https://portal.qiniu.com/mps/pipeline)新建。 |
||||
|
|
||||
@ -0,0 +1,30 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'demo'; |
||||
|
$prefix = 'test'; |
||||
|
$delete_after_days = 80; |
||||
|
$to_line_after_days =70; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->bucketLifecycleRule( |
||||
|
$bucket, |
||||
|
$name, |
||||
|
$prefix, |
||||
|
$delete_after_days, |
||||
|
$to_line_after_days |
||||
|
); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Cdn\CdnManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Qiniu\Auth($accessKey, $secretKey); |
||||
|
$cdnManager = new CdnManager($auth); |
||||
|
|
||||
|
//获取流量和带宽数据 |
||||
|
//参考文档:http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html |
||||
|
|
||||
|
$domains = array( |
||||
|
"javasdk.qiniudn.com", |
||||
|
"phpsdk.qiniudn.com" |
||||
|
); |
||||
|
|
||||
|
$startDate = "2017-08-20"; |
||||
|
$endDate = "2017-08-21"; |
||||
|
|
||||
|
//5min or hour or day |
||||
|
$granularity = "day"; |
||||
|
|
||||
|
//获取带宽数据 |
||||
|
list($bandwidthData, $getBandwidthErr) = $cdnManager->getBandwidthData( |
||||
|
$domains, |
||||
|
$startDate, |
||||
|
$endDate, |
||||
|
$granularity |
||||
|
); |
||||
|
|
||||
|
if ($getBandwidthErr != null) { |
||||
|
var_dump($getBandwidthErr); |
||||
|
} else { |
||||
|
echo "get bandwidth data success\n"; |
||||
|
print_r($bandwidthData); |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Cdn\CdnManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Qiniu\Auth($accessKey, $secretKey); |
||||
|
$cdnManager = new CdnManager($auth); |
||||
|
|
||||
|
//获取流量和带宽数据 |
||||
|
//参考文档:http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html |
||||
|
|
||||
|
$domains = array( |
||||
|
"javasdk.qiniudn.com", |
||||
|
"phpsdk.qiniudn.com" |
||||
|
); |
||||
|
|
||||
|
$startDate = "2017-08-20"; |
||||
|
$endDate = "2017-08-21"; |
||||
|
|
||||
|
//5min or hour or day |
||||
|
$granularity = "day"; |
||||
|
|
||||
|
//获取流量数据 |
||||
|
list($fluxData, $getFluxErr) = $cdnManager->getFluxData($domains, $startDate, $endDate, $granularity); |
||||
|
if ($getFluxErr != null) { |
||||
|
var_dump($getFluxErr); |
||||
|
} else { |
||||
|
echo "get flux data success\n"; |
||||
|
print_r($fluxData); |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Cdn\CdnManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Qiniu\Auth($accessKey, $secretKey); |
||||
|
$cdnManager = new CdnManager($auth); |
||||
|
|
||||
|
$domains = array( |
||||
|
"javasdk.qiniudn.com", |
||||
|
"phpsdk.qiniudn.com" |
||||
|
); |
||||
|
|
||||
|
$logDate = '2017-08-20'; |
||||
|
|
||||
|
//获取日志下载链接 |
||||
|
//参考文档:http://developer.qiniu.com/article/fusion/api/log.html |
||||
|
|
||||
|
list($logListData, $getLogErr) = $cdnManager->getCdnLogList($domains, $logDate); |
||||
|
if ($getLogErr != null) { |
||||
|
var_dump($getLogErr); |
||||
|
} else { |
||||
|
echo "get cdn log list success\n"; |
||||
|
print_r($logListData); |
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Cdn\CdnManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Qiniu\Auth($accessKey, $secretKey); |
||||
|
|
||||
|
//待刷新的文件列表和目录,文件列表最多一次100个,目录最多一次10个 |
||||
|
//参考文档:http://developer.qiniu.com/article/fusion/api/refresh.html |
||||
|
$urls = array( |
||||
|
"http://phpsdk.qiniudn.com/qiniu.jpg", |
||||
|
"http://phpsdk.qiniudn.com/qiniu2.jpg", |
||||
|
); |
||||
|
|
||||
|
//刷新目录需要联系七牛技术支持开通账户权限 |
||||
|
$dirs = array( |
||||
|
"http://phpsdk.qiniudn.com/test/" |
||||
|
); |
||||
|
|
||||
|
$cdnManager = new CdnManager($auth); |
||||
|
|
||||
|
// 目前客户默认没有目录刷新权限,刷新会有400038报错,参考:https://developer.qiniu.com/fusion/api/1229/cache-refresh |
||||
|
// 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category |
||||
|
list($refreshResult, $refreshErr) = $cdnManager->refreshUrlsAndDirs($urls, $dirs); |
||||
|
if ($refreshErr != null) { |
||||
|
var_dump($refreshErr); |
||||
|
} else { |
||||
|
echo "refresh request sent\n"; |
||||
|
print_r($refreshResult); |
||||
|
} |
||||
|
|
||||
|
//如果只有刷新链接或者目录的需求,可以分布使用 |
||||
|
|
||||
|
list($refreshResult, $refreshErr) = $cdnManager->refreshUrls($urls); |
||||
|
if ($refreshErr != null) { |
||||
|
var_dump($refreshErr); |
||||
|
} else { |
||||
|
echo "refresh request sent\n"; |
||||
|
print_r($refreshResult); |
||||
|
} |
||||
|
|
||||
|
list($refreshResult, $refreshErr) = $cdnManager->refreshDirs($dirs); |
||||
|
if ($refreshErr != null) { |
||||
|
var_dump($refreshErr); |
||||
|
} else { |
||||
|
echo "refresh request sent\n"; |
||||
|
print_r($refreshResult); |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Cdn\CdnManager; |
||||
|
|
||||
|
//创建时间戳防盗链 |
||||
|
//时间戳防盗链密钥,后台获取 |
||||
|
$encryptKey = 'your_domain_timestamp_antileech_encryptkey'; |
||||
|
|
||||
|
//带访问协议的域名 |
||||
|
$url1 = 'http://phpsdk.qiniuts.com/24.jpg?avinfo'; |
||||
|
$url2 = 'http://phpsdk.qiniuts.com/24.jpg'; |
||||
|
|
||||
|
//有效期时间(单位秒) |
||||
|
$durationInSeconds = 3600; |
||||
|
|
||||
|
$signedUrl = CdnManager::createTimestampAntiLeechUrl($url1, $encryptKey, $durationInSeconds); |
||||
|
print($signedUrl); |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$name = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->deleteBucket($name); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'demo'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->deleteBucketEvent($bucket, $name); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'demo'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->deleteBucketLifecycleRule($bucket, $name); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->getBucketEvents($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->getBucketLifecycleRules($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$region = 'z1'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->listbuckets($region); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->getBucketQuota($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->bucketInfo($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$region = 'z1'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->bucketInfos($region); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->getCorsRules($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,74 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
// 引入图片处理类 |
||||
|
use Qiniu\Processing\ImageUrlBuilder; |
||||
|
|
||||
|
$imageUrlBuilder = new ImageUrlBuilder(); |
||||
|
|
||||
|
// 要处理图片 |
||||
|
$url = 'http://78re52.com1.z0.glb.clouddn.com/resource/gogopher.jpg'; |
||||
|
$url2 = 'http://78re52.com1.z0.glb.clouddn.com/resource/gogopher.jpg?watermark/1/gravity/SouthEast/dx/0/dy/0/image/' |
||||
|
. 'aHR0cDovL2Fkcy1jZG4uY2h1Y2h1amllLmNvbS9Ga1R6bnpIY2RLdmRBUFc5cHZZZ3pTc21UY0tB'; |
||||
|
$waterImage = 'http://developer.qiniu.com/resource/logo-2.jpg'; |
||||
|
|
||||
|
/** |
||||
|
* 缩略图链接拼接 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param int $mode 缩略模式 |
||||
|
* @param int $width 宽度 |
||||
|
* @param int $height 长度 |
||||
|
* @param string $format 输出类型 [可选] |
||||
|
* @param int $quality 图片质量 [可选] |
||||
|
* @param int $interlace 是否支持渐进显示 [可选] |
||||
|
* @param int $ignoreError 忽略结果 [可选] |
||||
|
* @return string |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
$thumbLink = $imageUrlBuilder->thumbnail($url, 1, 100, 100); |
||||
|
|
||||
|
// 函数方式调用 也可拼接多个操作参数 图片+水印 |
||||
|
$thumbLink2 = \Qiniu\thumbnail($url2, 1, 100, 100); |
||||
|
var_dump($thumbLink, $thumbLink2); |
||||
|
|
||||
|
/** |
||||
|
* 图片水印 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param string $image 水印图片链接 |
||||
|
* @param numeric $dissolve 透明度 [可选] |
||||
|
* @param string $gravity 水印位置 [可选] |
||||
|
* @param numeric $dx 横轴边距 [可选] |
||||
|
* @param numeric $dy 纵轴边距 [可选] |
||||
|
* @param numeric $watermarkScale 自适应原图的短边比例 [可选] |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
$waterLink = $imageUrlBuilder->waterImg($url, $waterImage); |
||||
|
// 函数调用方法 |
||||
|
//$waterLink = \Qiniu\waterImg($url, $waterImage); |
||||
|
var_dump($waterLink); |
||||
|
|
||||
|
/** |
||||
|
* 文字水印 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param string $text 文字 |
||||
|
* @param string $font 文字字体 |
||||
|
* @param string $fontSize 文字字号 |
||||
|
* @param string $fontColor 文字颜色 [可选] |
||||
|
* @param numeric $dissolve 透明度 [可选] |
||||
|
* @param string $gravity 水印位置 [可选] |
||||
|
* @param numeric $dx 横轴边距 [可选] |
||||
|
* @param numeric $dy 纵轴边距 [可选] |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
$textLink = $imageUrlBuilder->waterText($url, '你瞅啥', '微软雅黑', 300); |
||||
|
// 函数调用方法 |
||||
|
// $textLink = \Qiniu\waterText($url, '你瞅啥', '微软雅黑', 300); |
||||
|
var_dump($textLink); |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
$accessKey = 'Access_Key'; |
||||
|
$secretKey = 'Secret_Key'; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
// 要转码的文件所在的空间。 |
||||
|
$bucket = 'Bucket_Name'; |
||||
|
|
||||
|
// 转码是使用的队列名称。 https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'pipeline_name'; |
||||
|
|
||||
|
// 初始化 |
||||
|
$pfop = new PersistentFop($auth, $bucket, $pipeline); |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
$pfop = new Qiniu\Processing\PersistentFop(null, null); |
||||
|
|
||||
|
// 触发持久化处理后返回的 Id |
||||
|
$persistentId = 'z1.5b8a48e5856db843bc24cfc3'; |
||||
|
|
||||
|
// 通过persistentId查询该 触发持久化处理的状态 |
||||
|
list($ret, $err) = $pfop->status($persistentId); |
||||
|
|
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
// 去我们的portal 后台来获取AK, SK |
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$key = 'qiniu.png'; |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
// 异步任务的队列, 去后台新建: https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'sdktest'; |
||||
|
|
||||
|
$pfop = new PersistentFop($auth, null); |
||||
|
|
||||
|
// 进行zip压缩的url |
||||
|
$url1 = 'http://phpsdk.qiniudn.com/php-logo.png'; |
||||
|
$url2 = 'http://phpsdk.qiniudn.com/1.png'; |
||||
|
|
||||
|
//压缩后的key |
||||
|
$zipKey = 'test.zip'; |
||||
|
|
||||
|
$fops = 'mkzip/2/url/' . \Qiniu\base64_urlSafeEncode($url1); |
||||
|
$fops .= '/url/' . \Qiniu\base64_urlSafeEncode($url2); |
||||
|
$fops .= '|saveas/' . \Qiniu\base64_urlSafeEncode("$bucket:$zipKey"); |
||||
|
|
||||
|
$notify_url = null; |
||||
|
$force = false; |
||||
|
|
||||
|
list($id, $err) = $pfop->execute($bucket, $key, $fops, $pipeline, $notify_url, $force); |
||||
|
|
||||
|
echo "\n====> pfop mkzip result: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
echo "PersistentFop Id: $id\n"; |
||||
|
|
||||
|
$res = "http://api.qiniu.com/status/get/prefop?id=$id"; |
||||
|
echo "Processing result: $res"; |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
//对已经上传到七牛的视频发起异步转码操作 |
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
//要转码的文件所在的空间和文件名。 |
||||
|
$key = 'qiniu.mp4'; |
||||
|
|
||||
|
//转码是使用的队列名称。 https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'sdktest'; |
||||
|
|
||||
|
//转码完成后通知到你的业务服务器。 |
||||
|
$notifyUrl = 'http://375dec79.ngrok.com/notify.php'; |
||||
|
$force = false; |
||||
|
|
||||
|
$config = new \Qiniu\Config(); |
||||
|
$config->useHTTPS = true; |
||||
|
$pfop = new PersistentFop($auth, $config); |
||||
|
|
||||
|
//要进行视频截图操作 |
||||
|
$fops = "vframe/jpg/offset/1/w/480/h/360/rotate/90|saveas/" . |
||||
|
\Qiniu\base64_urlSafeEncode($bucket . ":qiniu_480x360.jpg"); |
||||
|
|
||||
|
list($id, $err) = $pfop->execute($bucket, $key, $fops, $pipeline, $notifyUrl, $force); |
||||
|
echo "\n====> pfop avthumb result: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
echo "PersistentFop Id: $id\n"; |
||||
|
} |
||||
|
|
||||
|
//查询转码的进度和状态 |
||||
|
list($ret, $err) = $pfop->status($id); |
||||
|
echo "\n====> pfop avthumb status: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
//对已经上传到七牛的视频发起异步转码操作 |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
//要转码的文件所在的空间和文件名。 |
||||
|
$key = 'qiniu.mp4'; |
||||
|
|
||||
|
//转码是使用的队列名称。 https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'sdktest'; |
||||
|
$force = false; |
||||
|
|
||||
|
//转码完成后通知到你的业务服务器。 |
||||
|
$notifyUrl = 'http://375dec79.ngrok.com/notify.php'; |
||||
|
$config = new \Qiniu\Config(); |
||||
|
//$config->useHTTPS=true; |
||||
|
|
||||
|
$pfop = new PersistentFop($auth, $config); |
||||
|
|
||||
|
//要进行转码的转码操作。 http://developer.qiniu.com/docs/v6/api/reference/fop/av/avthumb.html |
||||
|
$fops = "avthumb/mp4/s/640x360/vb/1.4m|saveas/" . \Qiniu\base64_urlSafeEncode($bucket . ":qiniu_640x360.mp4"); |
||||
|
|
||||
|
list($id, $err) = $pfop->execute($bucket, $key, $fops, $pipeline, $notifyUrl, $force); |
||||
|
echo "\n====> pfop avthumb result: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
echo "PersistentFop Id: $id\n"; |
||||
|
} |
||||
|
|
||||
|
//查询转码的进度和状态 |
||||
|
list($ret, $err) = $pfop->status($id); |
||||
|
echo "\n====> pfop avthumb status: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
//对已经上传到七牛的视频发起异步转码操作 |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
//要转码的文件所在的空间和文件名。 |
||||
|
$key = 'qiniu.mp4'; |
||||
|
|
||||
|
//转码是使用的队列名称。 https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'sdktest'; |
||||
|
|
||||
|
//转码完成后通知到你的业务服务器。 |
||||
|
$notifyUrl = 'http://375dec79.ngrok.com/notify.php'; |
||||
|
$force = false; |
||||
|
|
||||
|
$config = new \Qiniu\Config(); |
||||
|
//$config->useHTTPS=true; |
||||
|
$pfop = new PersistentFop($auth, $config); |
||||
|
|
||||
|
//需要添加水印的图片UrlSafeBase64 |
||||
|
//可以参考http://developer.qiniu.com/code/v6/api/dora-api/av/video-watermark.html |
||||
|
$base64URL = Qiniu\base64_urlSafeEncode('http://devtools.qiniu.com/qiniu.png'); |
||||
|
|
||||
|
//水印参数 |
||||
|
$fops = "avthumb/mp4/s/640x360/vb/1.4m/image/" . $base64URL . "|saveas/" |
||||
|
. \Qiniu\base64_urlSafeEncode($bucket . ":qiniu_wm.mp4"); |
||||
|
|
||||
|
list($id, $err) = $pfop->execute($bucket, $key, $fops, $pipeline, $notifyUrl, $force); |
||||
|
echo "\n====> pfop avthumb result: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
echo "PersistentFop Id: $id\n"; |
||||
|
} |
||||
|
|
||||
|
//查询转码的进度和状态 |
||||
|
list($ret, $err) = $pfop->status($id); |
||||
|
echo "\n====> pfop avthumb status: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
|
After Width: | Height: | Size: 64 KiB |
@ -0,0 +1,29 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
$accessKey = 'Access_Key'; |
||||
|
$secretKey = 'Secret_Key'; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
//要持久化处理的文件所在的空间和文件名。 |
||||
|
$bucket = 'Bucket_Name'; |
||||
|
|
||||
|
//持久化处理使用的队列名称。 https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'pipeline_name'; |
||||
|
|
||||
|
//持久化处理完成后通知到你的业务服务器。 |
||||
|
$notifyUrl = 'http://375dec79.ngrok.com/notify.php'; |
||||
|
$pfop = new PersistentFop($auth, $bucket, $pipeline, $notifyUrl); |
||||
|
|
||||
|
$id = "z2.5955c739e3d0041bf80c9baa"; |
||||
|
//查询持久化处理的进度和状态 |
||||
|
list($ret, $err) = $pfop->status($id); |
||||
|
echo "\n====> pfop avthumb status: \n"; |
||||
|
if ($err != null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,55 @@ |
|||||
|
<?php |
||||
|
|
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Http\Client; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$argusManager = new \Qiniu\Storage\ArgusManager($auth, $config); |
||||
|
|
||||
|
$reqBody = array(); |
||||
|
$reqBody['uri'] = "xxxx"; |
||||
|
|
||||
|
$ops = array(); |
||||
|
$ops = array( |
||||
|
array( |
||||
|
'op' => 'pulp', |
||||
|
'params' => array( |
||||
|
'labels' => array( |
||||
|
array( |
||||
|
'label' => "1", |
||||
|
'select' => 1, |
||||
|
'score' => 2, |
||||
|
), |
||||
|
) |
||||
|
) |
||||
|
), |
||||
|
); |
||||
|
|
||||
|
$params = array(); |
||||
|
$params = array( |
||||
|
'async' => false, |
||||
|
'vframe' => array( |
||||
|
'mode' => 1, |
||||
|
'interval' => 8, |
||||
|
) |
||||
|
); |
||||
|
|
||||
|
$req = array(); |
||||
|
$req['data'] = $reqBody; |
||||
|
$req['ops'] = $ops; |
||||
|
$req['params'] = $params; |
||||
|
$body = json_encode($req); |
||||
|
|
||||
|
$vid = "xxxx"; |
||||
|
list($ret, $err) = $argusManager->pulpVideo($body, $vid); |
||||
|
|
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$private = 1; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putBucketAccessMode($bucket, $private); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$mode = 1; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putBucketAccessStyleMode($bucket, $mode); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'testdemo'; |
||||
|
$prefix = 'test1'; |
||||
|
$suffix = 'mp3'; |
||||
|
$event = array("move","copy"); |
||||
|
$callbackURL = 'http://www.qiniu.com'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putBucketEvent($bucket, $name, $prefix, $suffix, $event, $callbackURL); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$maxAge = 15768000; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putBucketMaxAge($bucket, $maxAge); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$size = 99999; |
||||
|
$count = 99; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putBucketQuota($bucket, $size, $count); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$mode = 1; |
||||
|
$norefer = "1"; |
||||
|
$pattern = "*.qiniu.com"; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->putReferAntiLeech($bucket, $mode, $norefer, $pattern); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
use Qiniu\Etag; |
||||
|
|
||||
|
$localFile = "/Users/jemy/Documents/qiniu.mp4"; |
||||
|
list($etag, $err) = Etag::sum($localFile); |
||||
|
if ($err == null) { |
||||
|
echo "Etag: $etag"; |
||||
|
} else { |
||||
|
var_dump($err); |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keyMimePairs = array( |
||||
|
'qiniu.mp4' => 'video/x-mp4', |
||||
|
'qiniu.png' => 'image/x-png', |
||||
|
'qiniu.jpg' => 'image/x-jpg' |
||||
|
); |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchChangeMime($bucket, $keyMimePairs); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$keyTypePairs = array(); |
||||
|
//type=0表示普通存储,type=1表示低频存储 |
||||
|
foreach ($keys as $key) { |
||||
|
$keyTypePairs[$key] = 1; |
||||
|
} |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchChangeType($bucket, $keyTypePairs); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$keyPairs = array(); |
||||
|
foreach ($keys as $key) { |
||||
|
$keyPairs[$key] = $key . "_copy"; |
||||
|
} |
||||
|
|
||||
|
$srcBucket = $bucket; |
||||
|
$destBucket = $bucket; |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchCopy($srcBucket, $keyPairs, $destBucket, true); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchDelete($bucket, $keys); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$keyDayPairs = array(); |
||||
|
//day=0表示永久存储 |
||||
|
foreach ($keys as $key) { |
||||
|
$keyDayPairs[$key] = 0; |
||||
|
} |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchDeleteAfterDays($bucket, $keyDayPairs); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$keyPairs = array(); |
||||
|
foreach ($keys as $key) { |
||||
|
$keyPairs[$key . "_copy"] = $key . "_move"; |
||||
|
} |
||||
|
|
||||
|
$srcBucket = $bucket; |
||||
|
$destBucket = $bucket; |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchMove($srcBucket, $keyPairs, $destBucket, true); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
//每次最多不能超过1000个 |
||||
|
$keys = array( |
||||
|
'qiniu.mp4', |
||||
|
'qiniu.png', |
||||
|
'qiniu.jpg' |
||||
|
); |
||||
|
|
||||
|
$ops = $bucketManager->buildBatchStat($bucket, $keys); |
||||
|
list($ret, $err) = $bucketManager->batch($ops); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
list($domains, $err) = $bucketManager->domains($bucket); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($domains); |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?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); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
list($buckets, $err) = $bucketManager->buckets(true); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($buckets); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = 'qiniu.mp4'; |
||||
|
$newMime = 'video/x-mp4'; |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$err = $bucketManager->changeMime($bucket, $key, $newMime); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.jpg"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$status = 1;//0表示启用;1表示禁用 |
||||
|
|
||||
|
$err = $bucketManager->changeStatus($bucket, $key, $status); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$fileType = 1;//0 表示普通存储,1表示低频存储 |
||||
|
|
||||
|
$err = $bucketManager->changeType($bucket, $key, $fileType); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$srcBucket = $bucket; |
||||
|
$destBucket = $bucket; |
||||
|
$srcKey = $key; |
||||
|
$destKey = $key . "_copy"; |
||||
|
$err = $bucketManager->copy($srcBucket, $srcKey, $destBucket, $destKey, true); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4_copy"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
$err = $bucketManager->delete($bucket, $key); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = 'qiniu.mp4'; |
||||
|
$days = 10; |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$err = $bucketManager->deleteAfterDays($bucket, $key, $days); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
// 构建Auth对象 |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
// 私有空间中的外链 http://<domain>/<file_key> |
||||
|
$baseUrl = 'http://if-pri.qiniudn.com/qiniu.png?imageView2/1/h/500'; |
||||
|
// 对链接进行签名 |
||||
|
$signedUrl = $auth->privateDownloadUrl($baseUrl); |
||||
|
|
||||
|
echo $signedUrl; |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\BucketManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$bucketManager = new BucketManager($auth); |
||||
|
|
||||
|
$url = 'http://devtools.qiniu.com/qiniu.png'; |
||||
|
$key = time() . '.png'; |
||||
|
|
||||
|
// 指定抓取的文件保存名称 |
||||
|
list($ret, $err) = $bucketManager->fetch($url, $bucket, $key); |
||||
|
echo "=====> fetch $url to bucket: $bucket key: $key\n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
|
|
||||
|
// 不指定key时,以文件内容的hash作为文件名 |
||||
|
$key = null; |
||||
|
list($ret, $err) = $bucketManager->fetch($url, $bucket, $key); |
||||
|
echo "=====> fetch $url to bucket: $bucket key: $(etag)\n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$srcBucket = $bucket; |
||||
|
$destBucket = $bucket; |
||||
|
$srcKey = $key . "_copy"; |
||||
|
$destKey = $key . "_move"; |
||||
|
$err = $bucketManager->move($srcBucket, $srcKey, $destBucket, $destKey, true); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
$err = $bucketManager->prefetch($bucket, $key); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = 'gwd_gV4gPKZZsmEOvAuNU1AcumicmuHooTfu64q5'; |
||||
|
$secretKey = '9G4isTkVuj5ITPqH1ajhljJMTc2k4m-hZh5r5ZsK'; |
||||
|
$bucket = 'file'; |
||||
|
|
||||
|
$domain = 'lfxfile.qiniuts.com'; |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$err = $bucketManager->publishDomain($bucket, $domain); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use \Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
$key = "qiniu.mp4"; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
list($fileInfo, $err) = $bucketManager->stat($bucket, $key); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($fileInfo); |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\BucketManager; |
||||
|
|
||||
|
// http://developer.qiniu.com/docs/v6/api/reference/rs/list.html#list-description |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$bucketManager = new BucketManager($auth); |
||||
|
|
||||
|
|
||||
|
// 要列取文件的公共前缀 |
||||
|
$prefix = ''; |
||||
|
|
||||
|
// 上次列举返回的位置标记,作为本次列举的起点信息。 |
||||
|
$marker = ''; |
||||
|
|
||||
|
// 本次列举的条目数 |
||||
|
$limit = 200; |
||||
|
|
||||
|
$delimiter = '/'; |
||||
|
|
||||
|
// 列举文件 |
||||
|
do { |
||||
|
list($ret, $err) = $bucketManager->listFiles($bucket, $prefix, $marker, $limit, $delimiter); |
||||
|
if ($err !== null) { |
||||
|
echo "\n====> list file err: \n"; |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
$marker = null; |
||||
|
if (array_key_exists('marker', $ret)) { |
||||
|
$marker = $ret['marker']; |
||||
|
} |
||||
|
echo "Marker: $marker\n"; |
||||
|
echo "\nList Items====>\n"; |
||||
|
//var_dump($ret['items']); |
||||
|
print('items count:' . count($ret['items']) . "\n"); |
||||
|
if (array_key_exists('commonPrefixes', $ret)) { |
||||
|
print_r($ret['commonPrefixes']); |
||||
|
} |
||||
|
} |
||||
|
} while (!empty($marker)); |
||||
@ -0,0 +1,38 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\BucketManager; |
||||
|
|
||||
|
// http://developer.qiniu.com/docs/v6/api/reference/rs/list.html#list-description |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$bucketManager = new BucketManager($auth); |
||||
|
|
||||
|
|
||||
|
// 要列取文件的公共前缀 |
||||
|
$prefix = ''; |
||||
|
|
||||
|
// 上次列举返回的位置标记,作为本次列举的起点信息。 |
||||
|
$marker = ''; |
||||
|
|
||||
|
// 本次列举的条目数 |
||||
|
$limit = 100; |
||||
|
|
||||
|
$delimiter = '/'; |
||||
|
|
||||
|
// 列举文件 |
||||
|
list($ret, $err) = $bucketManager->listFiles($bucket, $prefix, $marker, $limit, $delimiter); |
||||
|
if ($err !== null) { |
||||
|
echo "\n====> list file err: \n"; |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
if (array_key_exists('marker', $ret)) { |
||||
|
echo "Marker:" . $ret["marker"] . "\n"; |
||||
|
} |
||||
|
echo "\nList Iterms====>\n"; |
||||
|
//var_dump($ret['items']); |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\BucketManager; |
||||
|
|
||||
|
// http://developer.qiniu.com/docs/v6/api/reference/rs/list.html#list-description |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = 'xxxx'; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$bucketManager = new BucketManager($auth); |
||||
|
|
||||
|
|
||||
|
// 要列取文件的公共前缀 |
||||
|
$prefix = ''; |
||||
|
|
||||
|
// 上次列举返回的位置标记,作为本次列举的起点信息。 |
||||
|
$marker = ''; |
||||
|
|
||||
|
// 本次列举的条目数 |
||||
|
$limit = 1000; |
||||
|
|
||||
|
$delimiter = ''; |
||||
|
|
||||
|
list($ret, $err) = $bucketManager->listFilesv2($bucket, $prefix, $marker, $limit, $delimiter, true); |
||||
|
|
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($ret); |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Processing\PersistentFop; |
||||
|
|
||||
|
// 后台来获取AK, SK |
||||
|
$accessKey = 'Access_Key'; |
||||
|
$secretKey = 'Secret_Key'; |
||||
|
|
||||
|
//生成EncodedEntryURI的值 |
||||
|
$entry = '<bucket>:<Key>';//<Key>为生成缩略图的文件名 |
||||
|
//生成的值 |
||||
|
$encodedEntryURI = \Qiniu\base64_urlSafeEncode($entry); |
||||
|
|
||||
|
//使用SecretKey对新的下载URL进行HMAC1-SHA1签名 |
||||
|
$newurl = "78re52.com1.z0.glb.clouddn.com/resource/Ship.jpg?imageView2/2/w/200/h/200|saveas/" . $encodedEntryURI; |
||||
|
|
||||
|
$sign = hash_hmac("sha1", $newurl, $secretKey, true); |
||||
|
|
||||
|
//对签名进行URL安全的Base64编码 |
||||
|
$encodedSign = \Qiniu\base64_urlSafeEncode($sign); |
||||
|
//最终得到的完整下载URL |
||||
|
$finalURL = "http://" . $newurl . "/sign/" . $accessKey . ":" . $encodedSign; |
||||
|
|
||||
|
$callbackBody = file_get_contents("$finalURL"); |
||||
|
|
||||
|
echo $callbackBody; |
||||
@ -0,0 +1,25 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'demo'; |
||||
|
$prefix = 'test'; |
||||
|
$suffix = 'mp4'; |
||||
|
$event = 'mkfile'; |
||||
|
$callbackURL = 'https://www.qiniu.com'; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->updateBucketEvent($bucket, $name, $prefix, $suffix, $event, $callbackURL); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$config = new \Qiniu\Config(); |
||||
|
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config); |
||||
|
|
||||
|
$bucket = 'xxxx'; |
||||
|
$name = 'demo'; |
||||
|
$prefix = 'test'; |
||||
|
$delete_after_days = 90; |
||||
|
$to_line_after_days =80; |
||||
|
|
||||
|
list($Info, $err) = $bucketManager->updateBucketLifecycleRule( |
||||
|
$bucket, |
||||
|
$name, |
||||
|
$prefix, |
||||
|
$delete_after_days, |
||||
|
$to_line_after_days |
||||
|
); |
||||
|
if ($err) { |
||||
|
print_r($err); |
||||
|
} else { |
||||
|
print_r($Info); |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
|
||||
|
// use Qiniu\Config; |
||||
|
// use Qiniu\Zone; |
||||
|
|
||||
|
// 指定zone上传 |
||||
|
// $zone = Zone::qvmZonez0(); //华东QVM内网上传指定host |
||||
|
// $config = new Config($zone); |
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
// 上传文件到七牛后, 七牛将文件名和文件大小回调给业务服务器. |
||||
|
// 可参考文档: http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html |
||||
|
$policy = array( |
||||
|
'callbackUrl' => 'http://your.domain.com/upload_verify_callback.php', |
||||
|
'callbackBody' => 'filename=$(fname)&filesize=$(fsize)' |
||||
|
); |
||||
|
$uptoken = $auth->uploadToken($bucket, null, 3600, $policy); |
||||
|
//上传文件的本地路径 |
||||
|
$filePath = './php-logo.png'; |
||||
|
//指定 config |
||||
|
// $uploadMgr = new UploadManager($config); |
||||
|
$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); |
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
|
||||
|
// 在七牛保存的文件名 |
||||
|
$key = 'php-logo.png'; |
||||
|
$uploadMgr = new UploadManager(); |
||||
|
|
||||
|
$pfop = "imageMogr2/rotate/90|saveas/" . \Qiniu\base64_urlSafeEncode($bucket . ":php-logo-rotate.png"); |
||||
|
|
||||
|
//转码完成后通知到你的业务服务器。(公网可以访问,并相应200 OK) |
||||
|
$notifyUrl = 'http://notify.fake.com'; |
||||
|
|
||||
|
//独立的转码队列:https://portal.qiniu.com/mps/pipeline |
||||
|
$pipeline = 'sdktest'; |
||||
|
|
||||
|
$policy = array( |
||||
|
'persistentOps' => $pfop, |
||||
|
'persistentNotifyUrl' => $notifyUrl, |
||||
|
'persistentPipeline' => $pipeline |
||||
|
); |
||||
|
$token = $auth->uploadToken($bucket, null, 3600, $policy); |
||||
|
|
||||
|
list($ret, $err) = $uploadMgr->putFile($token, null, $key); |
||||
|
echo "\n====> putFile result: \n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
|
||||
|
$accessKey = 'Access_Key'; |
||||
|
$secretKey = 'Secret_Key'; |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
// 空间名 http://developer.qiniu.com/docs/v6/api/overview/concepts.html#bucket |
||||
|
$bucket = 'Bucket_Name'; |
||||
|
|
||||
|
// 生成上传Token |
||||
|
$token = $auth->uploadToken($bucket); |
||||
|
|
||||
|
// 构建 UploadManager 对象 |
||||
|
$uploadMgr = new UploadManager(); |
||||
@ -0,0 +1,85 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
|
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
$pipeline = 'sdktest'; |
||||
|
|
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
$token = $auth->uploadToken($bucket); |
||||
|
$uploadMgr = new UploadManager(); |
||||
|
|
||||
|
//----------------------------------------upload demo1 ---------------------------------------- |
||||
|
// 上传字符串到七牛 |
||||
|
list($ret, $err) = $uploadMgr->put($token, null, 'content string'); |
||||
|
echo "\n====> put result: \n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//----------------------------------------upload demo2 ---------------------------------------- |
||||
|
// 上传文件到七牛 |
||||
|
$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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//----------------------------------------upload demo3 ---------------------------------------- |
||||
|
// 上传文件到七牛后, 七牛将文件名和文件大小回调给业务服务器. |
||||
|
// 可参考文档: http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html |
||||
|
$policy = array( |
||||
|
'callbackUrl' => 'http://172.30.251.210/upload_verify_callback.php', |
||||
|
'callbackBody' => 'filename=$(fname)&filesize=$(fsize)' |
||||
|
// 'callbackBodyType' => 'application/json', |
||||
|
// 'callbackBody' => '{"filename":$(fname), "filesize": $(fsize)}' //设置application/json格式回调 |
||||
|
); |
||||
|
$token = $auth->uploadToken($bucket, null, 3600, $policy); |
||||
|
|
||||
|
|
||||
|
list($ret, $err) = $uploadMgr->putFile($token, null, $key); |
||||
|
echo "\n====> putFile result: \n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//----------------------------------------upload demo4 ---------------------------------------- |
||||
|
//上传视频,上传完成后进行m3u8的转码, 并给视频打水印 |
||||
|
$wmImg = Qiniu\base64_urlSafeEncode('http://devtools.qiniudn.com/qiniu.png'); |
||||
|
$pfop = "avthumb/m3u8/wmImage/$wmImg"; |
||||
|
|
||||
|
//转码完成后回调到业务服务器。(公网可以访问,并相应200 OK) |
||||
|
$notifyUrl = 'http://notify.fake.com'; |
||||
|
|
||||
|
//独立的转码队列:https://portal.qiniu.com/mps/pipeline |
||||
|
|
||||
|
|
||||
|
$policy = array( |
||||
|
'persistentOps' => $pfop, |
||||
|
'persistentNotifyUrl' => $notifyUrl, |
||||
|
'persistentPipeline' => $pipeline |
||||
|
); |
||||
|
$token = $auth->uploadToken($bucket, null, 3600, $policy); |
||||
|
print($token); |
||||
|
list($ret, $err) = $uploadMgr->putFile($token, null, $key); |
||||
|
echo "\n====> putFile result: \n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__ . '/../autoload.php'; |
||||
|
|
||||
|
// 引入鉴权类 |
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
// 引入上传类 |
||||
|
use Qiniu\Storage\UploadManager; |
||||
|
|
||||
|
// 需要填写你的 Access Key 和 Secret Key |
||||
|
$accessKey = getenv('QINIU_ACCESS_KEY'); |
||||
|
$secretKey = getenv('QINIU_SECRET_KEY'); |
||||
|
$bucket = getenv('QINIU_TEST_BUCKET'); |
||||
|
|
||||
|
// 构建鉴权对象 |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
// 生成上传 Token |
||||
|
$token = $auth->uploadToken($bucket); |
||||
|
|
||||
|
// 要上传文件的本地路径 |
||||
|
$filePath = './php-logo.png'; |
||||
|
|
||||
|
// 上传到七牛后保存的文件名 |
||||
|
$key = 'my-php-logo.png'; |
||||
|
|
||||
|
// 初始化 UploadManager 对象并进行文件的上传。 |
||||
|
$uploadMgr = new UploadManager(); |
||||
|
|
||||
|
// 调用 UploadManager 的 putFile 方法进行文件的上传。 |
||||
|
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath); |
||||
|
echo "\n====> putFile result: \n"; |
||||
|
if ($err !== null) { |
||||
|
var_dump($err); |
||||
|
} else { |
||||
|
var_dump($ret); |
||||
|
} |
||||
@ -0,0 +1,68 @@ |
|||||
|
<?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状态 |
||||
|
$auth = new Auth($accessKey, $secretKey); |
||||
|
|
||||
|
// 简单上传凭证 |
||||
|
$expires = 3600; |
||||
|
|
||||
|
$policy = null; |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
// 自定义凭证有效期(示例2小时) |
||||
|
$expires = 7200; |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
// 覆盖上传凭证 |
||||
|
$expires = 3600; |
||||
|
$keyToOverwrite = 'qiniu.mp4'; |
||||
|
$upToken = $auth->uploadToken($bucket, $keyToOverwrite, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
//自定义上传回复(非callback模式)凭证 |
||||
|
$returnBody = '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}'; |
||||
|
$policy = array( |
||||
|
'returnBody' => $returnBody |
||||
|
); |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
//带回调业务服务器的凭证(application/json) |
||||
|
$policy = array( |
||||
|
'callbackUrl' => 'http://api.example.com/qiniu/upload/callback', |
||||
|
'callbackBody' => '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}', |
||||
|
'callbackBodyType' => 'application/json' |
||||
|
); |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
|
||||
|
//带回调业务服务器的凭证(application/x-www-form-urlencoded) |
||||
|
$policy = array( |
||||
|
'callbackUrl' => 'http://api.example.com/qiniu/upload/callback', |
||||
|
'callbackBody' => 'key=$(key)&hash=$(etag)&bucket=$(bucket)&fsize=$(fsize)&name=$(x:name)' |
||||
|
); |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
|
|
||||
|
//带数据处理的凭证 |
||||
|
$saveMp4Entry = \Qiniu\base64_urlSafeEncode($bucket . ":avthumb_test_target.mp4"); |
||||
|
$saveJpgEntry = \Qiniu\base64_urlSafeEncode($bucket . ":vframe_test_target.jpg"); |
||||
|
$avthumbMp4Fop = "avthumb/mp4|saveas/" . $saveMp4Entry; |
||||
|
$vframeJpgFop = "vframe/jpg/offset/1|saveas/" . $saveJpgEntry; |
||||
|
$policy = array( |
||||
|
'persistentOps' => $avthumbMp4Fop . ";" . $vframeJpgFop, |
||||
|
'persistentPipeline' => "video-pipe", |
||||
|
'persistentNotifyUrl' => "http://api.example.com/qiniu/pfop/notify", |
||||
|
); |
||||
|
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true); |
||||
|
print($upToken . "\n"); |
||||
@ -0,0 +1,32 @@ |
|||||
|
<?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,具体可以参考:http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html |
||||
|
$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); |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<phpunit backupGlobals="false" |
||||
|
backupStaticAttributes="false" |
||||
|
bootstrap="./tests/bootstrap.php" |
||||
|
colors="true" |
||||
|
convertErrorsToExceptions="true" |
||||
|
convertNoticesToExceptions="true" |
||||
|
convertWarningsToExceptions="true" |
||||
|
processIsolation="false" |
||||
|
stopOnFailure="false" |
||||
|
> |
||||
|
<testsuites> |
||||
|
<testsuite name="Qiniu SDK Tests"> |
||||
|
<directory>tests</directory> |
||||
|
</testsuite> |
||||
|
</testsuites> |
||||
|
|
||||
|
</phpunit> |
||||
@ -0,0 +1,187 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu; |
||||
|
|
||||
|
use Qiniu\Zone; |
||||
|
|
||||
|
final class Auth |
||||
|
{ |
||||
|
private $accessKey; |
||||
|
private $secretKey; |
||||
|
|
||||
|
public function __construct($accessKey, $secretKey) |
||||
|
{ |
||||
|
$this->accessKey = $accessKey; |
||||
|
$this->secretKey = $secretKey; |
||||
|
} |
||||
|
|
||||
|
public function getAccessKey() |
||||
|
{ |
||||
|
return $this->accessKey; |
||||
|
} |
||||
|
|
||||
|
public function sign($data) |
||||
|
{ |
||||
|
$hmac = hash_hmac('sha1', $data, $this->secretKey, true); |
||||
|
return $this->accessKey . ':' . \Qiniu\base64_urlSafeEncode($hmac); |
||||
|
} |
||||
|
|
||||
|
public function signWithData($data) |
||||
|
{ |
||||
|
$encodedData = \Qiniu\base64_urlSafeEncode($data); |
||||
|
return $this->sign($encodedData) . ':' . $encodedData; |
||||
|
} |
||||
|
|
||||
|
public function signRequest($urlString, $body, $contentType = null) |
||||
|
{ |
||||
|
$url = parse_url($urlString); |
||||
|
$data = ''; |
||||
|
if (array_key_exists('path', $url)) { |
||||
|
$data = $url['path']; |
||||
|
} |
||||
|
if (array_key_exists('query', $url)) { |
||||
|
$data .= '?' . $url['query']; |
||||
|
} |
||||
|
$data .= "\n"; |
||||
|
|
||||
|
if ($body !== null && $contentType === 'application/x-www-form-urlencoded') { |
||||
|
$data .= $body; |
||||
|
} |
||||
|
return $this->sign($data); |
||||
|
} |
||||
|
|
||||
|
public function verifyCallback($contentType, $originAuthorization, $url, $body) |
||||
|
{ |
||||
|
$authorization = 'QBox ' . $this->signRequest($url, $body, $contentType); |
||||
|
return $originAuthorization === $authorization; |
||||
|
} |
||||
|
|
||||
|
public function privateDownloadUrl($baseUrl, $expires = 3600) |
||||
|
{ |
||||
|
$deadline = time() + $expires; |
||||
|
|
||||
|
$pos = strpos($baseUrl, '?'); |
||||
|
if ($pos !== false) { |
||||
|
$baseUrl .= '&e='; |
||||
|
} else { |
||||
|
$baseUrl .= '?e='; |
||||
|
} |
||||
|
$baseUrl .= $deadline; |
||||
|
|
||||
|
$token = $this->sign($baseUrl); |
||||
|
return "$baseUrl&token=$token"; |
||||
|
} |
||||
|
|
||||
|
public function uploadToken($bucket, $key = null, $expires = 3600, $policy = null, $strictPolicy = true) |
||||
|
{ |
||||
|
$deadline = time() + $expires; |
||||
|
$scope = $bucket; |
||||
|
if ($key !== null) { |
||||
|
$scope .= ':' . $key; |
||||
|
} |
||||
|
|
||||
|
$args = self::copyPolicy($args, $policy, $strictPolicy); |
||||
|
$args['scope'] = $scope; |
||||
|
$args['deadline'] = $deadline; |
||||
|
|
||||
|
$b = json_encode($args); |
||||
|
return $this->signWithData($b); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
*上传策略,参数规格详见 |
||||
|
*http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html |
||||
|
*/ |
||||
|
private static $policyFields = array( |
||||
|
'callbackUrl', |
||||
|
'callbackBody', |
||||
|
'callbackHost', |
||||
|
'callbackBodyType', |
||||
|
'callbackFetchKey', |
||||
|
|
||||
|
'returnUrl', |
||||
|
'returnBody', |
||||
|
|
||||
|
'endUser', |
||||
|
'saveKey', |
||||
|
'insertOnly', |
||||
|
|
||||
|
'detectMime', |
||||
|
'mimeLimit', |
||||
|
'fsizeMin', |
||||
|
'fsizeLimit', |
||||
|
|
||||
|
'persistentOps', |
||||
|
'persistentNotifyUrl', |
||||
|
'persistentPipeline', |
||||
|
|
||||
|
'deleteAfterDays', |
||||
|
'fileType', |
||||
|
'isPrefixalScope', |
||||
|
); |
||||
|
|
||||
|
private static function copyPolicy(&$policy, $originPolicy, $strictPolicy) |
||||
|
{ |
||||
|
if ($originPolicy === null) { |
||||
|
return array(); |
||||
|
} |
||||
|
foreach ($originPolicy as $key => $value) { |
||||
|
if (!$strictPolicy || in_array((string)$key, self::$policyFields, true)) { |
||||
|
$policy[$key] = $value; |
||||
|
} |
||||
|
} |
||||
|
return $policy; |
||||
|
} |
||||
|
|
||||
|
public function authorization($url, $body = null, $contentType = null) |
||||
|
{ |
||||
|
$authorization = 'QBox ' . $this->signRequest($url, $body, $contentType); |
||||
|
return array('Authorization' => $authorization); |
||||
|
} |
||||
|
|
||||
|
public function authorizationV2($url, $method, $body = null, $contentType = null) |
||||
|
{ |
||||
|
$urlItems = parse_url($url); |
||||
|
$host = $urlItems['host']; |
||||
|
|
||||
|
if (isset($urlItems['port'])) { |
||||
|
$port = $urlItems['port']; |
||||
|
} else { |
||||
|
$port = ''; |
||||
|
} |
||||
|
|
||||
|
$path = $urlItems['path']; |
||||
|
if (isset($urlItems['query'])) { |
||||
|
$query = $urlItems['query']; |
||||
|
} else { |
||||
|
$query = ''; |
||||
|
} |
||||
|
|
||||
|
//write request uri |
||||
|
$toSignStr = $method . ' ' . $path; |
||||
|
if (!empty($query)) { |
||||
|
$toSignStr .= '?' . $query; |
||||
|
} |
||||
|
|
||||
|
//write host and port |
||||
|
$toSignStr .= "\nHost: " . $host; |
||||
|
if (!empty($port)) { |
||||
|
$toSignStr .= ":" . $port; |
||||
|
} |
||||
|
|
||||
|
//write content type |
||||
|
if (!empty($contentType)) { |
||||
|
$toSignStr .= "\nContent-Type: " . $contentType; |
||||
|
} |
||||
|
|
||||
|
$toSignStr .= "\n\n"; |
||||
|
|
||||
|
//write body |
||||
|
if (!empty($body)) { |
||||
|
$toSignStr .= $body; |
||||
|
} |
||||
|
|
||||
|
$sign = $this->sign($toSignStr); |
||||
|
$auth = 'Qiniu ' . $sign; |
||||
|
return array('Authorization' => $auth); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,185 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Qiniu\Cdn; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Http\Error; |
||||
|
use Qiniu\Http\Client; |
||||
|
|
||||
|
final class CdnManager |
||||
|
{ |
||||
|
|
||||
|
private $auth; |
||||
|
private $server; |
||||
|
|
||||
|
public function __construct(Auth $auth) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
$this->server = 'http://fusion.qiniuapi.com'; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $urls 待刷新的文件链接数组 |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function refreshUrls(array $urls) |
||||
|
{ |
||||
|
return $this->refreshUrlsAndDirs($urls, array()); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $dirs 待刷新的文件链接数组 |
||||
|
* @return array |
||||
|
* 目前客户默认没有目录刷新权限,刷新会有400038报错,参考:https://developer.qiniu.com/fusion/api/1229/cache-refresh |
||||
|
* 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category |
||||
|
*/ |
||||
|
public function refreshDirs(array $dirs) |
||||
|
{ |
||||
|
return $this->refreshUrlsAndDirs(array(), $dirs); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $urls 待刷新的文件链接数组 |
||||
|
* @param array $dirs 待刷新的目录链接数组 |
||||
|
* |
||||
|
* @return array 刷新的请求回复和错误,参考 examples/cdn_manager.php 代码 |
||||
|
* @link http://developer.qiniu.com/article/fusion/api/refresh.html |
||||
|
* |
||||
|
* 目前客户默认没有目录刷新权限,刷新会有400038报错,参考:https://developer.qiniu.com/fusion/api/1229/cache-refresh |
||||
|
* 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category |
||||
|
*/ |
||||
|
public function refreshUrlsAndDirs(array $urls, array $dirs) |
||||
|
{ |
||||
|
$req = array(); |
||||
|
if (!empty($urls)) { |
||||
|
$req['urls'] = $urls; |
||||
|
} |
||||
|
if (!empty($dirs)) { |
||||
|
$req['dirs'] = $dirs; |
||||
|
} |
||||
|
|
||||
|
$url = $this->server . '/v2/tune/refresh'; |
||||
|
$body = json_encode($req); |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $urls 待预取的文件链接数组 |
||||
|
* |
||||
|
* @return array 预取的请求回复和错误,参考 examples/cdn_manager.php 代码 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/article/fusion/api/refresh.html |
||||
|
*/ |
||||
|
public function prefetchUrls(array $urls) |
||||
|
{ |
||||
|
$req = array( |
||||
|
'urls' => $urls, |
||||
|
); |
||||
|
|
||||
|
$url = $this->server . '/v2/tune/prefetch'; |
||||
|
$body = json_encode($req); |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $domains 待获取带宽数据的域名数组 |
||||
|
* @param string $startDate 开始的日期,格式类似 2017-01-01 |
||||
|
* @param string $endDate 结束的日期,格式类似 2017-01-01 |
||||
|
* @param string $granularity 获取数据的时间间隔,可以是 5min, hour 或者 day |
||||
|
* |
||||
|
* @return array 带宽数据和错误信息,参考 examples/cdn_manager.php 代码 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html |
||||
|
*/ |
||||
|
public function getBandwidthData(array $domains, $startDate, $endDate, $granularity) |
||||
|
{ |
||||
|
$req = array(); |
||||
|
$req['domains'] = implode(';', $domains); |
||||
|
$req['startDate'] = $startDate; |
||||
|
$req['endDate'] = $endDate; |
||||
|
$req['granularity'] = $granularity; |
||||
|
|
||||
|
$url = $this->server . '/v2/tune/bandwidth'; |
||||
|
$body = json_encode($req); |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $domains 待获取流量数据的域名数组 |
||||
|
* @param string $startDate 开始的日期,格式类似 2017-01-01 |
||||
|
* @param string $endDate 结束的日期,格式类似 2017-01-01 |
||||
|
* @param string $granularity 获取数据的时间间隔,可以是 5min, hour 或者 day |
||||
|
* |
||||
|
* @return array 流量数据和错误信息,参考 examples/cdn_manager.php 代码 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html |
||||
|
*/ |
||||
|
public function getFluxData(array $domains, $startDate, $endDate, $granularity) |
||||
|
{ |
||||
|
$req = array(); |
||||
|
$req['domains'] = implode(';', $domains); |
||||
|
$req['startDate'] = $startDate; |
||||
|
$req['endDate'] = $endDate; |
||||
|
$req['granularity'] = $granularity; |
||||
|
|
||||
|
$url = $this->server . '/v2/tune/flux'; |
||||
|
$body = json_encode($req); |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param array $domains 待获取日志下载链接的域名数组 |
||||
|
* @param string $logDate 获取指定日期的日志下载链接,格式类似 2017-01-01 |
||||
|
* |
||||
|
* @return array 日志下载链接数据和错误信息,参考 examples/cdn_manager.php 代码 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/article/fusion/api/log.html |
||||
|
*/ |
||||
|
public function getCdnLogList(array $domains, $logDate) |
||||
|
{ |
||||
|
$req = array(); |
||||
|
$req['domains'] = implode(';', $domains); |
||||
|
$req['day'] = $logDate; |
||||
|
|
||||
|
$url = $this->server . '/v2/tune/log/list'; |
||||
|
$body = json_encode($req); |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
private function post($url, $body) |
||||
|
{ |
||||
|
$headers = $this->auth->authorization($url, $body, 'application/json'); |
||||
|
$headers['Content-Type'] = 'application/json'; |
||||
|
$ret = Client::post($url, $body, $headers); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
return array($r, null); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 构建时间戳防盗链鉴权的访问外链 |
||||
|
* |
||||
|
* @param string $rawUrl 需要签名的资源url |
||||
|
* @param string $encryptKey 时间戳防盗链密钥 |
||||
|
* @param string $durationInSeconds 链接的有效期(以秒为单位) |
||||
|
* |
||||
|
* @return string 带鉴权信息的资源外链,参考 examples/cdn_timestamp_antileech.php 代码 |
||||
|
*/ |
||||
|
public static function createTimestampAntiLeechUrl($rawUrl, $encryptKey, $durationInSeconds) |
||||
|
{ |
||||
|
$parsedUrl = parse_url($rawUrl); |
||||
|
$deadline = time() + $durationInSeconds; |
||||
|
$expireHex = dechex($deadline); |
||||
|
$path = isset($parsedUrl['path']) ? $parsedUrl['path'] : ''; |
||||
|
$strToSign = $encryptKey . $path . $expireHex; |
||||
|
$signStr = md5($strToSign); |
||||
|
if (isset($parsedUrl['query'])) { |
||||
|
$signedUrl = $rawUrl . '&sign=' . $signStr . '&t=' . $expireHex; |
||||
|
} else { |
||||
|
$signedUrl = $rawUrl . '?sign=' . $signStr . '&t=' . $expireHex; |
||||
|
} |
||||
|
return $signedUrl; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,140 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu; |
||||
|
|
||||
|
final class Config |
||||
|
{ |
||||
|
const SDK_VER = '7.2.10'; |
||||
|
|
||||
|
const BLOCK_SIZE = 4194304; //4*1024*1024 分块上传块大小,该参数为接口规格,不能修改 |
||||
|
|
||||
|
const RSF_HOST = 'rsf.qiniu.com'; |
||||
|
const API_HOST = 'api.qiniu.com'; |
||||
|
const RS_HOST = 'rs.qiniu.com'; //RS Host |
||||
|
const UC_HOST = 'uc.qbox.me'; //UC Host |
||||
|
const RTCAPI_HOST = 'http://rtc.qiniuapi.com'; |
||||
|
const ARGUS_HOST = 'argus.atlab.ai'; |
||||
|
const CASTER_HOST = 'pili-caster.qiniuapi.com'; |
||||
|
const SMS_HOST="https://sms.qiniuapi.com"; |
||||
|
const RTCAPI_VERSION = 'v3'; |
||||
|
const SMS_VERSION='v1'; |
||||
|
|
||||
|
// Zone 空间对应的存储区域 |
||||
|
public $region; |
||||
|
//BOOL 是否使用https域名 |
||||
|
public $useHTTPS; |
||||
|
//BOOL 是否使用CDN加速上传域名 |
||||
|
public $useCdnDomains; |
||||
|
// Zone Cache |
||||
|
private $regionCache; |
||||
|
|
||||
|
// 构造函数 |
||||
|
public function __construct(Region $z = null) |
||||
|
{ |
||||
|
$this->zone = $z; |
||||
|
$this->useHTTPS = false; |
||||
|
$this->useCdnDomains = false; |
||||
|
$this->regionCache = array(); |
||||
|
} |
||||
|
|
||||
|
public function getUpHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
$host = $region->srcUpHosts[0]; |
||||
|
if ($this->useCdnDomains === true) { |
||||
|
$host = $region->cdnUpHosts[0]; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $host; |
||||
|
} |
||||
|
|
||||
|
public function getUpBackupHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
$host = $region->cdnUpHosts[0]; |
||||
|
if ($this->useCdnDomains === true) { |
||||
|
$host = $region->srcUpHosts[0]; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $host; |
||||
|
} |
||||
|
|
||||
|
public function getRsHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
|
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $region->rsHost; |
||||
|
} |
||||
|
|
||||
|
public function getRsfHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
|
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $region->rsfHost; |
||||
|
} |
||||
|
|
||||
|
public function getIovipHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
|
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $region->iovipHost; |
||||
|
} |
||||
|
|
||||
|
public function getApiHost($accessKey, $bucket) |
||||
|
{ |
||||
|
$region = $this->getRegion($accessKey, $bucket); |
||||
|
|
||||
|
if ($this->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} else { |
||||
|
$scheme = "http://"; |
||||
|
} |
||||
|
|
||||
|
return $scheme . $region->apiHost; |
||||
|
} |
||||
|
|
||||
|
private function getRegion($accessKey, $bucket) |
||||
|
{ |
||||
|
$cacheId = "$accessKey:$bucket"; |
||||
|
|
||||
|
if (isset($this->regionCache[$cacheId])) { |
||||
|
$region = $this->regionCache[$cacheId]; |
||||
|
} elseif (isset($this->zone)) { |
||||
|
$region = $this->zone; |
||||
|
$this->regionCache[$cacheId] = $region; |
||||
|
} else { |
||||
|
$region = Zone::queryZone($accessKey, $bucket); |
||||
|
$this->regionCache[$cacheId] = $region; |
||||
|
} |
||||
|
return $region; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,76 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Qiniu; |
||||
|
|
||||
|
use Qiniu\Config; |
||||
|
|
||||
|
final class Etag |
||||
|
{ |
||||
|
private static function packArray($v, $a) |
||||
|
{ |
||||
|
return call_user_func_array('pack', array_merge(array($v), (array)$a)); |
||||
|
} |
||||
|
|
||||
|
private static function blockCount($fsize) |
||||
|
{ |
||||
|
return intval(($fsize + (Config::BLOCK_SIZE - 1)) / Config::BLOCK_SIZE); |
||||
|
} |
||||
|
|
||||
|
private static function calcSha1($data) |
||||
|
{ |
||||
|
$sha1Str = sha1($data, true); |
||||
|
$err = error_get_last(); |
||||
|
if ($err !== null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
$byteArray = unpack('C*', $sha1Str); |
||||
|
return array($byteArray, null); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public static function sum($filename) |
||||
|
{ |
||||
|
$fhandler = fopen($filename, 'r'); |
||||
|
$err = error_get_last(); |
||||
|
if ($err !== null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
|
||||
|
$fstat = fstat($fhandler); |
||||
|
$fsize = $fstat['size']; |
||||
|
if ((int)$fsize === 0) { |
||||
|
fclose($fhandler); |
||||
|
return array('Fto5o-5ea0sNMlW_75VgGJCv2AcJ', null); |
||||
|
} |
||||
|
$blockCnt = self::blockCount($fsize); |
||||
|
$sha1Buf = array(); |
||||
|
|
||||
|
if ($blockCnt <= 1) { |
||||
|
array_push($sha1Buf, 0x16); |
||||
|
$fdata = fread($fhandler, Config::BLOCK_SIZE); |
||||
|
if ($err !== null) { |
||||
|
fclose($fhandler); |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
list($sha1Code,) = self::calcSha1($fdata); |
||||
|
$sha1Buf = array_merge($sha1Buf, $sha1Code); |
||||
|
} else { |
||||
|
array_push($sha1Buf, 0x96); |
||||
|
$sha1BlockBuf = array(); |
||||
|
for ($i = 0; $i < $blockCnt; $i++) { |
||||
|
$fdata = fread($fhandler, Config::BLOCK_SIZE); |
||||
|
list($sha1Code, $err) = self::calcSha1($fdata); |
||||
|
if ($err !== null) { |
||||
|
fclose($fhandler); |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
$sha1BlockBuf = array_merge($sha1BlockBuf, $sha1Code); |
||||
|
} |
||||
|
$tmpData = self::packArray('C*', $sha1BlockBuf); |
||||
|
list($sha1Final,) = self::calcSha1($tmpData); |
||||
|
$sha1Buf = array_merge($sha1Buf, $sha1Final); |
||||
|
} |
||||
|
$etag = \Qiniu\base64_urlSafeEncode(self::packArray('C*', $sha1Buf)); |
||||
|
return array($etag, null); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,160 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Http; |
||||
|
|
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Http\Request; |
||||
|
use Qiniu\Http\Response; |
||||
|
|
||||
|
final class Client |
||||
|
{ |
||||
|
public static function get($url, array $headers = array()) |
||||
|
{ |
||||
|
$request = new Request('GET', $url, $headers); |
||||
|
return self::sendRequest($request); |
||||
|
} |
||||
|
|
||||
|
public static function delete($url, array $headers = array()) |
||||
|
{ |
||||
|
$request = new Request('DELETE', $url, $headers); |
||||
|
return self::sendRequest($request); |
||||
|
} |
||||
|
|
||||
|
public static function post($url, $body, array $headers = array()) |
||||
|
{ |
||||
|
$request = new Request('POST', $url, $headers, $body); |
||||
|
return self::sendRequest($request); |
||||
|
} |
||||
|
|
||||
|
public static function PUT($url, $body, array $headers = array()) |
||||
|
{ |
||||
|
$request = new Request('PUT', $url, $headers, $body); |
||||
|
return self::sendRequest($request); |
||||
|
} |
||||
|
|
||||
|
public static function multipartPost( |
||||
|
$url, |
||||
|
$fields, |
||||
|
$name, |
||||
|
$fileName, |
||||
|
$fileBody, |
||||
|
$mimeType = null, |
||||
|
array $headers = array() |
||||
|
) { |
||||
|
$data = array(); |
||||
|
$mimeBoundary = md5(microtime()); |
||||
|
|
||||
|
foreach ($fields as $key => $val) { |
||||
|
array_push($data, '--' . $mimeBoundary); |
||||
|
array_push($data, "Content-Disposition: form-data; name=\"$key\""); |
||||
|
array_push($data, ''); |
||||
|
array_push($data, $val); |
||||
|
} |
||||
|
|
||||
|
array_push($data, '--' . $mimeBoundary); |
||||
|
$finalMimeType = empty($mimeType) ? 'application/octet-stream' : $mimeType; |
||||
|
$finalFileName = self::escapeQuotes($fileName); |
||||
|
array_push($data, "Content-Disposition: form-data; name=\"$name\"; filename=\"$finalFileName\""); |
||||
|
array_push($data, "Content-Type: $finalMimeType"); |
||||
|
array_push($data, ''); |
||||
|
array_push($data, $fileBody); |
||||
|
|
||||
|
array_push($data, '--' . $mimeBoundary . '--'); |
||||
|
array_push($data, ''); |
||||
|
|
||||
|
$body = implode("\r\n", $data); |
||||
|
// var_dump($data);exit; |
||||
|
$contentType = 'multipart/form-data; boundary=' . $mimeBoundary; |
||||
|
$headers['Content-Type'] = $contentType; |
||||
|
$request = new Request('POST', $url, $headers, $body); |
||||
|
return self::sendRequest($request); |
||||
|
} |
||||
|
|
||||
|
private static function userAgent() |
||||
|
{ |
||||
|
$sdkInfo = "QiniuPHP/" . Config::SDK_VER; |
||||
|
|
||||
|
$systemInfo = php_uname("s"); |
||||
|
$machineInfo = php_uname("m"); |
||||
|
|
||||
|
$envInfo = "($systemInfo/$machineInfo)"; |
||||
|
|
||||
|
$phpVer = phpversion(); |
||||
|
|
||||
|
$ua = "$sdkInfo $envInfo PHP/$phpVer"; |
||||
|
return $ua; |
||||
|
} |
||||
|
|
||||
|
public static function sendRequest($request) |
||||
|
{ |
||||
|
$t1 = microtime(true); |
||||
|
$ch = curl_init(); |
||||
|
$options = array( |
||||
|
CURLOPT_USERAGENT => self::userAgent(), |
||||
|
CURLOPT_RETURNTRANSFER => true, |
||||
|
CURLOPT_SSL_VERIFYPEER => false, |
||||
|
CURLOPT_SSL_VERIFYHOST => false, |
||||
|
CURLOPT_HEADER => true, |
||||
|
CURLOPT_NOBODY => false, |
||||
|
CURLOPT_CUSTOMREQUEST => $request->method, |
||||
|
CURLOPT_URL => $request->url, |
||||
|
); |
||||
|
// Handle open_basedir & safe mode |
||||
|
if (!ini_get('safe_mode') && !ini_get('open_basedir')) { |
||||
|
$options[CURLOPT_FOLLOWLOCATION] = true; |
||||
|
} |
||||
|
if (!empty($request->headers)) { |
||||
|
$headers = array(); |
||||
|
foreach ($request->headers as $key => $val) { |
||||
|
array_push($headers, "$key: $val"); |
||||
|
} |
||||
|
$options[CURLOPT_HTTPHEADER] = $headers; |
||||
|
} |
||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); |
||||
|
if (!empty($request->body)) { |
||||
|
$options[CURLOPT_POSTFIELDS] = $request->body; |
||||
|
} |
||||
|
curl_setopt_array($ch, $options); |
||||
|
$result = curl_exec($ch); |
||||
|
$t2 = microtime(true); |
||||
|
$duration = round($t2 - $t1, 3); |
||||
|
$ret = curl_errno($ch); |
||||
|
if ($ret !== 0) { |
||||
|
$r = new Response(-1, $duration, array(), null, curl_error($ch)); |
||||
|
curl_close($ch); |
||||
|
return $r; |
||||
|
} |
||||
|
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); |
||||
|
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); |
||||
|
$headers = self::parseHeaders(substr($result, 0, $header_size)); |
||||
|
$body = substr($result, $header_size); |
||||
|
curl_close($ch); |
||||
|
return new Response($code, $duration, $headers, $body, null); |
||||
|
} |
||||
|
|
||||
|
private static function parseHeaders($raw) |
||||
|
{ |
||||
|
$headers = array(); |
||||
|
$headerLines = explode("\r\n", $raw); |
||||
|
foreach ($headerLines as $line) { |
||||
|
$headerLine = trim($line); |
||||
|
$kv = explode(':', $headerLine); |
||||
|
if (count($kv) > 1) { |
||||
|
$kv[0] =self::ucwordsHyphen($kv[0]); |
||||
|
$headers[$kv[0]] = trim($kv[1]); |
||||
|
} |
||||
|
} |
||||
|
return $headers; |
||||
|
} |
||||
|
|
||||
|
private static function escapeQuotes($str) |
||||
|
{ |
||||
|
$find = array("\\", "\""); |
||||
|
$replace = array("\\\\", "\\\""); |
||||
|
return str_replace($find, $replace, $str); |
||||
|
} |
||||
|
|
||||
|
private static function ucwordsHyphen($str) |
||||
|
{ |
||||
|
return str_replace('- ', '-', ucwords(str_replace('-', '- ', $str))); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Http; |
||||
|
|
||||
|
/** |
||||
|
* 七牛业务请求逻辑错误封装类,主要用来解析API请求返回如下的内容: |
||||
|
* <pre> |
||||
|
* {"error" : "detailed error message"} |
||||
|
* </pre> |
||||
|
*/ |
||||
|
final class Error |
||||
|
{ |
||||
|
private $url; |
||||
|
private $response; |
||||
|
|
||||
|
public function __construct($url, $response) |
||||
|
{ |
||||
|
$this->url = $url; |
||||
|
$this->response = $response; |
||||
|
} |
||||
|
|
||||
|
public function code() |
||||
|
{ |
||||
|
return $this->response->statusCode; |
||||
|
} |
||||
|
|
||||
|
public function getResponse() |
||||
|
{ |
||||
|
return $this->response; |
||||
|
} |
||||
|
|
||||
|
public function message() |
||||
|
{ |
||||
|
return $this->response->error; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Http; |
||||
|
|
||||
|
final class Request |
||||
|
{ |
||||
|
public $url; |
||||
|
public $headers; |
||||
|
public $body; |
||||
|
public $method; |
||||
|
|
||||
|
public function __construct($method, $url, array $headers = array(), $body = null) |
||||
|
{ |
||||
|
$this->method = strtoupper($method); |
||||
|
$this->url = $url; |
||||
|
$this->headers = $headers; |
||||
|
$this->body = $body; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,176 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Qiniu\Http; |
||||
|
|
||||
|
/** |
||||
|
* HTTP response Object |
||||
|
*/ |
||||
|
final class Response |
||||
|
{ |
||||
|
public $statusCode; |
||||
|
public $headers; |
||||
|
public $body; |
||||
|
public $error; |
||||
|
private $jsonData; |
||||
|
public $duration; |
||||
|
|
||||
|
/** @var array Mapping of status codes to reason phrases */ |
||||
|
private static $statusTexts = array( |
||||
|
100 => 'Continue', |
||||
|
101 => 'Switching Protocols', |
||||
|
102 => 'Processing', |
||||
|
200 => 'OK', |
||||
|
201 => 'Created', |
||||
|
202 => 'Accepted', |
||||
|
203 => 'Non-Authoritative Information', |
||||
|
204 => 'No Content', |
||||
|
205 => 'Reset Content', |
||||
|
206 => 'Partial Content', |
||||
|
207 => 'Multi-Status', |
||||
|
208 => 'Already Reported', |
||||
|
226 => 'IM Used', |
||||
|
300 => 'Multiple Choices', |
||||
|
301 => 'Moved Permanently', |
||||
|
302 => 'Found', |
||||
|
303 => 'See Other', |
||||
|
304 => 'Not Modified', |
||||
|
305 => 'Use Proxy', |
||||
|
307 => 'Temporary Redirect', |
||||
|
308 => 'Permanent Redirect', |
||||
|
400 => 'Bad Request', |
||||
|
401 => 'Unauthorized', |
||||
|
402 => 'Payment Required', |
||||
|
403 => 'Forbidden', |
||||
|
404 => 'Not Found', |
||||
|
405 => 'Method Not Allowed', |
||||
|
406 => 'Not Acceptable', |
||||
|
407 => 'Proxy Authentication Required', |
||||
|
408 => 'Request Timeout', |
||||
|
409 => 'Conflict', |
||||
|
410 => 'Gone', |
||||
|
411 => 'Length Required', |
||||
|
412 => 'Precondition Failed', |
||||
|
413 => 'Request Entity Too Large', |
||||
|
414 => 'Request-URI Too Long', |
||||
|
415 => 'Unsupported Media Type', |
||||
|
416 => 'Requested Range Not Satisfiable', |
||||
|
417 => 'Expectation Failed', |
||||
|
422 => 'Unprocessable Entity', |
||||
|
423 => 'Locked', |
||||
|
424 => 'Failed Dependency', |
||||
|
425 => 'Reserved for WebDAV advanced collections expired proposal', |
||||
|
426 => 'Upgrade required', |
||||
|
428 => 'Precondition Required', |
||||
|
429 => 'Too Many Requests', |
||||
|
431 => 'Request Header Fields Too Large', |
||||
|
500 => 'Internal Server Error', |
||||
|
501 => 'Not Implemented', |
||||
|
502 => 'Bad Gateway', |
||||
|
503 => 'Service Unavailable', |
||||
|
504 => 'Gateway Timeout', |
||||
|
505 => 'HTTP Version Not Supported', |
||||
|
506 => 'Variant Also Negotiates (Experimental)', |
||||
|
507 => 'Insufficient Storage', |
||||
|
508 => 'Loop Detected', |
||||
|
510 => 'Not Extended', |
||||
|
511 => 'Network Authentication Required', |
||||
|
); |
||||
|
|
||||
|
/** |
||||
|
* @param int $code 状态码 |
||||
|
* @param double $duration 请求时长 |
||||
|
* @param array $headers 响应头部 |
||||
|
* @param string $body 响应内容 |
||||
|
* @param string $error 错误描述 |
||||
|
*/ |
||||
|
public function __construct($code, $duration, array $headers = array(), $body = null, $error = null) |
||||
|
{ |
||||
|
$this->statusCode = $code; |
||||
|
$this->duration = $duration; |
||||
|
$this->headers = $headers; |
||||
|
$this->body = $body; |
||||
|
$this->error = $error; |
||||
|
$this->jsonData = null; |
||||
|
if ($error !== null) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if ($body === null) { |
||||
|
if ($code >= 400) { |
||||
|
$this->error = self::$statusTexts[$code]; |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
if (self::isJson($headers)) { |
||||
|
try { |
||||
|
$jsonData = self::bodyJson($body); |
||||
|
if ($code >= 400) { |
||||
|
$this->error = $body; |
||||
|
if ($jsonData['error'] !== null) { |
||||
|
$this->error = $jsonData['error']; |
||||
|
} |
||||
|
} |
||||
|
$this->jsonData = $jsonData; |
||||
|
} catch (\InvalidArgumentException $e) { |
||||
|
$this->error = $body; |
||||
|
if ($code >= 200 && $code < 300) { |
||||
|
$this->error = $e->getMessage(); |
||||
|
} |
||||
|
} |
||||
|
} elseif ($code >= 400) { |
||||
|
$this->error = $body; |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
public function json() |
||||
|
{ |
||||
|
return $this->jsonData; |
||||
|
} |
||||
|
|
||||
|
private static function bodyJson($body) |
||||
|
{ |
||||
|
return \Qiniu\json_decode((string) $body, true, 512); |
||||
|
} |
||||
|
|
||||
|
public function xVia() |
||||
|
{ |
||||
|
$via = $this->headers['X-Via']; |
||||
|
if ($via === null) { |
||||
|
$via = $this->headers['X-Px']; |
||||
|
} |
||||
|
if ($via === null) { |
||||
|
$via = $this->headers['Fw-Via']; |
||||
|
} |
||||
|
return $via; |
||||
|
} |
||||
|
|
||||
|
public function xLog() |
||||
|
{ |
||||
|
return $this->headers['X-Log']; |
||||
|
} |
||||
|
|
||||
|
public function xReqId() |
||||
|
{ |
||||
|
return $this->headers['X-Reqid']; |
||||
|
} |
||||
|
|
||||
|
public function ok() |
||||
|
{ |
||||
|
return $this->statusCode >= 200 && $this->statusCode < 300 && $this->error === null; |
||||
|
} |
||||
|
|
||||
|
public function needRetry() |
||||
|
{ |
||||
|
$code = $this->statusCode; |
||||
|
if ($code < 0 || ($code / 100 === 5 and $code !== 579) || $code === 996) { |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static function isJson($headers) |
||||
|
{ |
||||
|
return array_key_exists('Content-Type', $headers) && |
||||
|
strpos($headers['Content-Type'], 'application/json') === 0; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,282 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Processing; |
||||
|
|
||||
|
use Qiniu; |
||||
|
|
||||
|
/** |
||||
|
* 主要涉及图片链接拼接 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html |
||||
|
*/ |
||||
|
final class ImageUrlBuilder |
||||
|
{ |
||||
|
/** |
||||
|
* mode合法范围值 |
||||
|
* |
||||
|
* @var array |
||||
|
*/ |
||||
|
protected $modeArr = array(0, 1, 2, 3, 4, 5); |
||||
|
|
||||
|
/** |
||||
|
* format合法值 |
||||
|
* |
||||
|
* @var array |
||||
|
*/ |
||||
|
protected $formatArr = array('psd', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'bmp'); |
||||
|
|
||||
|
/** |
||||
|
* 水印图片位置合法值 |
||||
|
* |
||||
|
* @var array |
||||
|
*/ |
||||
|
protected $gravityArr = array('NorthWest', 'North', 'NorthEast', |
||||
|
'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast'); |
||||
|
|
||||
|
/** |
||||
|
* 缩略图链接拼接 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param int $mode 缩略模式 |
||||
|
* @param int $width 宽度 |
||||
|
* @param int $height 长度 |
||||
|
* @param string $format 输出类型 |
||||
|
* @param int $quality 图片质量 |
||||
|
* @param int $interlace 是否支持渐进显示 |
||||
|
* @param int $ignoreError 忽略结果 |
||||
|
* @return string |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
public function thumbnail( |
||||
|
$url, |
||||
|
$mode, |
||||
|
$width, |
||||
|
$height, |
||||
|
$format = null, |
||||
|
$interlace = null, |
||||
|
$quality = null, |
||||
|
$ignoreError = 1 |
||||
|
) { |
||||
|
|
||||
|
// url合法效验 |
||||
|
if (!$this->isUrl($url)) { |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
// 参数合法性效验 |
||||
|
if (!in_array(intval($mode), $this->modeArr, true)) { |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
if (!$width || !$height) { |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
$thumbStr = 'imageView2/' . $mode . '/w/' . $width . '/h/' . $height . '/'; |
||||
|
|
||||
|
// 拼接输出格式 |
||||
|
if (!is_null($format) |
||||
|
&& in_array($format, $this->formatArr) |
||||
|
) { |
||||
|
$thumbStr .= 'format/' . $format . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接渐进显示 |
||||
|
if (!is_null($interlace) |
||||
|
&& in_array(intval($interlace), array(0, 1), true) |
||||
|
) { |
||||
|
$thumbStr .= 'interlace/' . $interlace . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接图片质量 |
||||
|
if (!is_null($quality) |
||||
|
&& intval($quality) >= 0 |
||||
|
&& intval($quality) <= 100 |
||||
|
) { |
||||
|
$thumbStr .= 'q/' . $quality . '/'; |
||||
|
} |
||||
|
|
||||
|
$thumbStr .= 'ignore-error/' . $ignoreError . '/'; |
||||
|
|
||||
|
// 如果有query_string用|线分割实现多参数 |
||||
|
return $url . ($this->hasQuery($url) ? '|' : '?') . $thumbStr; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 图片水印 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param string $image 水印图片链接 |
||||
|
* @param numeric $dissolve 透明度 |
||||
|
* @param string $gravity 水印位置 |
||||
|
* @param numeric $dx 横轴边距 |
||||
|
* @param numeric $dy 纵轴边距 |
||||
|
* @param numeric $watermarkScale 自适应原图的短边比例 |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
public function waterImg( |
||||
|
$url, |
||||
|
$image, |
||||
|
$dissolve = 100, |
||||
|
$gravity = 'SouthEast', |
||||
|
$dx = null, |
||||
|
$dy = null, |
||||
|
$watermarkScale = null |
||||
|
) { |
||||
|
// url合法效验 |
||||
|
if (!$this->isUrl($url)) { |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
$waterStr = 'watermark/1/image/' . \Qiniu\base64_urlSafeEncode($image) . '/'; |
||||
|
|
||||
|
// 拼接水印透明度 |
||||
|
if (is_numeric($dissolve) |
||||
|
&& $dissolve <= 100 |
||||
|
) { |
||||
|
$waterStr .= 'dissolve/' . $dissolve . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接水印位置 |
||||
|
if (in_array($gravity, $this->gravityArr, true)) { |
||||
|
$waterStr .= 'gravity/' . $gravity . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接横轴边距 |
||||
|
if (!is_null($dx) |
||||
|
&& is_numeric($dx) |
||||
|
) { |
||||
|
$waterStr .= 'dx/' . $dx . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接纵轴边距 |
||||
|
if (!is_null($dy) |
||||
|
&& is_numeric($dy) |
||||
|
) { |
||||
|
$waterStr .= 'dy/' . $dy . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接自适应原图的短边比例 |
||||
|
if (!is_null($watermarkScale) |
||||
|
&& is_numeric($watermarkScale) |
||||
|
&& $watermarkScale > 0 |
||||
|
&& $watermarkScale < 1 |
||||
|
) { |
||||
|
$waterStr .= 'ws/' . $watermarkScale . '/'; |
||||
|
} |
||||
|
|
||||
|
// 如果有query_string用|线分割实现多参数 |
||||
|
return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 文字水印 |
||||
|
* |
||||
|
* @param string $url 图片链接 |
||||
|
* @param string $text 文字 |
||||
|
* @param string $font 文字字体 |
||||
|
* @param string $fontSize 文字字号 |
||||
|
* @param string $fontColor 文字颜色 |
||||
|
* @param numeric $dissolve 透明度 |
||||
|
* @param string $gravity 水印位置 |
||||
|
* @param numeric $dx 横轴边距 |
||||
|
* @param numeric $dy 纵轴边距 |
||||
|
* @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
public function waterText( |
||||
|
$url, |
||||
|
$text, |
||||
|
$font = '黑体', |
||||
|
$fontSize = 0, |
||||
|
$fontColor = null, |
||||
|
$dissolve = 100, |
||||
|
$gravity = 'SouthEast', |
||||
|
$dx = null, |
||||
|
$dy = null |
||||
|
) { |
||||
|
// url合法效验 |
||||
|
if (!$this->isUrl($url)) { |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
$waterStr = 'watermark/2/text/' |
||||
|
. \Qiniu\base64_urlSafeEncode($text) . '/font/' |
||||
|
. \Qiniu\base64_urlSafeEncode($font) . '/'; |
||||
|
|
||||
|
// 拼接文字大小 |
||||
|
if (is_int($fontSize)) { |
||||
|
$waterStr .= 'fontsize/' . $fontSize . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接文字颜色 |
||||
|
if (!is_null($fontColor) |
||||
|
&& $fontColor |
||||
|
) { |
||||
|
$waterStr .= 'fill/' . \Qiniu\base64_urlSafeEncode($fontColor) . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接水印透明度 |
||||
|
if (is_numeric($dissolve) |
||||
|
&& $dissolve <= 100 |
||||
|
) { |
||||
|
$waterStr .= 'dissolve/' . $dissolve . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接水印位置 |
||||
|
if (in_array($gravity, $this->gravityArr, true)) { |
||||
|
$waterStr .= 'gravity/' . $gravity . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接横轴边距 |
||||
|
if (!is_null($dx) |
||||
|
&& is_numeric($dx) |
||||
|
) { |
||||
|
$waterStr .= 'dx/' . $dx . '/'; |
||||
|
} |
||||
|
|
||||
|
// 拼接纵轴边距 |
||||
|
if (!is_null($dy) |
||||
|
&& is_numeric($dy) |
||||
|
) { |
||||
|
$waterStr .= 'dy/' . $dy . '/'; |
||||
|
} |
||||
|
|
||||
|
// 如果有query_string用|线分割实现多参数 |
||||
|
return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 效验url合法性 |
||||
|
* |
||||
|
* @param string $url url链接 |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
protected function isUrl($url) |
||||
|
{ |
||||
|
$urlArr = parse_url($url); |
||||
|
|
||||
|
return $urlArr['scheme'] |
||||
|
&& in_array($urlArr['scheme'], array('http', 'https')) |
||||
|
&& $urlArr['host'] |
||||
|
&& $urlArr['path']; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 检测是否有query |
||||
|
* |
||||
|
* @param string $url url链接 |
||||
|
* @return string |
||||
|
* @author Sherlock Ren <sherlock_ren@icloud.com> |
||||
|
*/ |
||||
|
protected function hasQuery($url) |
||||
|
{ |
||||
|
$urlArr = parse_url($url); |
||||
|
|
||||
|
return !empty($urlArr['query']); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,60 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Qiniu\Processing; |
||||
|
|
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
|
||||
|
final class Operation |
||||
|
{ |
||||
|
|
||||
|
private $auth; |
||||
|
private $token_expire; |
||||
|
private $domain; |
||||
|
|
||||
|
public function __construct($domain, $auth = null, $token_expire = 3600) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
$this->domain = $domain; |
||||
|
$this->token_expire = $token_expire; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 对资源文件进行处理 |
||||
|
* |
||||
|
* @param $key 待处理的资源文件名 |
||||
|
* @param $fops string|array fop操作,多次fop操作以array的形式传入。 |
||||
|
* eg. imageView2/1/w/200/h/200, imageMogr2/thumbnail/!75px |
||||
|
* |
||||
|
* @return array 文件处理后的结果及错误。 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/fop/ |
||||
|
*/ |
||||
|
public function execute($key, $fops) |
||||
|
{ |
||||
|
$url = $this->buildUrl($key, $fops); |
||||
|
$resp = Client::get($url); |
||||
|
if (!$resp->ok()) { |
||||
|
return array(null, new Error($url, $resp)); |
||||
|
} |
||||
|
if ($resp->json() !== null) { |
||||
|
return array($resp->json(), null); |
||||
|
} |
||||
|
return array($resp->body, null); |
||||
|
} |
||||
|
|
||||
|
public function buildUrl($key, $fops, $protocol = 'http') |
||||
|
{ |
||||
|
if (is_array($fops)) { |
||||
|
$fops = implode('|', $fops); |
||||
|
} |
||||
|
|
||||
|
$url = $protocol . "://$this->domain/$key?$fops"; |
||||
|
if ($this->auth !== null) { |
||||
|
$url = $this->auth->privateDownloadUrl($url, $this->token_expire); |
||||
|
} |
||||
|
|
||||
|
return $url; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,94 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Processing; |
||||
|
|
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
use Qiniu\Processing\Operation; |
||||
|
|
||||
|
/** |
||||
|
* 持久化处理类,该类用于主动触发异步持久化操作. |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/fop/pfop/pfop.html |
||||
|
*/ |
||||
|
final class PersistentFop |
||||
|
{ |
||||
|
/** |
||||
|
* @var 账号管理密钥对,Auth对象 |
||||
|
*/ |
||||
|
private $auth; |
||||
|
|
||||
|
/* |
||||
|
* @var 配置对象,Config 对象 |
||||
|
* */ |
||||
|
private $config; |
||||
|
|
||||
|
|
||||
|
public function __construct($auth, $config = null) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
if ($config == null) { |
||||
|
$this->config = new Config(); |
||||
|
} else { |
||||
|
$this->config = $config; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 对资源文件进行异步持久化处理 |
||||
|
* @param $bucket 资源所在空间 |
||||
|
* @param $key 待处理的源文件 |
||||
|
* @param $fops string|array 待处理的pfop操作,多个pfop操作以array的形式传入。 |
||||
|
* eg. avthumb/mp3/ab/192k, vframe/jpg/offset/7/w/480/h/360 |
||||
|
* @param $pipeline 资源处理队列 |
||||
|
* @param $notify_url 处理结果通知地址 |
||||
|
* @param $force 是否强制执行一次新的指令 |
||||
|
* |
||||
|
* |
||||
|
* @return array 返回持久化处理的persistentId, 和返回的错误。 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/fop/ |
||||
|
*/ |
||||
|
public function execute($bucket, $key, $fops, $pipeline = null, $notify_url = null, $force = false) |
||||
|
{ |
||||
|
if (is_array($fops)) { |
||||
|
$fops = implode(';', $fops); |
||||
|
} |
||||
|
$params = array('bucket' => $bucket, 'key' => $key, 'fops' => $fops); |
||||
|
\Qiniu\setWithoutEmpty($params, 'pipeline', $pipeline); |
||||
|
\Qiniu\setWithoutEmpty($params, 'notifyURL', $notify_url); |
||||
|
if ($force) { |
||||
|
$params['force'] = 1; |
||||
|
} |
||||
|
$data = http_build_query($params); |
||||
|
$scheme = "http://"; |
||||
|
if ($this->config->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} |
||||
|
$url = $scheme . Config::API_HOST . '/pfop/'; |
||||
|
$headers = $this->auth->authorization($url, $data, 'application/x-www-form-urlencoded'); |
||||
|
$headers['Content-Type'] = 'application/x-www-form-urlencoded'; |
||||
|
$response = Client::post($url, $data, $headers); |
||||
|
if (!$response->ok()) { |
||||
|
return array(null, new Error($url, $response)); |
||||
|
} |
||||
|
$r = $response->json(); |
||||
|
$id = $r['persistentId']; |
||||
|
return array($id, null); |
||||
|
} |
||||
|
|
||||
|
public function status($id) |
||||
|
{ |
||||
|
$scheme = "http://"; |
||||
|
|
||||
|
if ($this->config->useHTTPS === true) { |
||||
|
$scheme = "https://"; |
||||
|
} |
||||
|
$url = $scheme . Config::API_HOST . "/status/get/prefop?id=$id"; |
||||
|
$response = Client::get($url); |
||||
|
if (!$response->ok()) { |
||||
|
return array(null, new Error($url, $response)); |
||||
|
} |
||||
|
return array($response->json(), null); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,196 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu; |
||||
|
|
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
|
||||
|
class Region |
||||
|
{ |
||||
|
|
||||
|
//源站上传域名 |
||||
|
public $srcUpHosts; |
||||
|
//CDN加速上传域名 |
||||
|
public $cdnUpHosts; |
||||
|
//资源管理域名 |
||||
|
public $rsHost; |
||||
|
//资源列举域名 |
||||
|
public $rsfHost; |
||||
|
//资源处理域名 |
||||
|
public $apiHost; |
||||
|
//IOVIP域名 |
||||
|
public $iovipHost; |
||||
|
|
||||
|
//构造一个Region对象 |
||||
|
public function __construct( |
||||
|
$srcUpHosts = array(), |
||||
|
$cdnUpHosts = array(), |
||||
|
$rsHost = "rs.qiniu.com", |
||||
|
$rsfHost = "rsf.qiniu.com", |
||||
|
$apiHost = "api.qiniu.com", |
||||
|
$iovipHost = null |
||||
|
) { |
||||
|
|
||||
|
$this->srcUpHosts = $srcUpHosts; |
||||
|
$this->cdnUpHosts = $cdnUpHosts; |
||||
|
$this->rsHost = $rsHost; |
||||
|
$this->rsfHost = $rsfHost; |
||||
|
$this->apiHost = $apiHost; |
||||
|
$this->iovipHost = $iovipHost; |
||||
|
} |
||||
|
|
||||
|
//华东机房 |
||||
|
public static function regionHuadong() |
||||
|
{ |
||||
|
$regionHuadong = new Region( |
||||
|
array("up.qiniup.com", 'up-jjh.qiniup.com', 'up-xs.qiniup.com'), |
||||
|
array('upload.qiniup.com', 'upload-jjh.qiniup.com', 'upload-xs.qiniup.com'), |
||||
|
'rs.qbox.me', |
||||
|
'rsf.qbox.me', |
||||
|
'api.qiniu.com', |
||||
|
'iovip.qbox.me' |
||||
|
); |
||||
|
return $regionHuadong; |
||||
|
} |
||||
|
|
||||
|
//华东机房内网上传 |
||||
|
public static function qvmRegionHuadong() |
||||
|
{ |
||||
|
$qvmRegionHuadong = new Region( |
||||
|
array("free-qvm-z0-xs.qiniup.com"), |
||||
|
'rs.qbox.me', |
||||
|
'rsf.qbox.me', |
||||
|
'api.qiniu.com', |
||||
|
'iovip.qbox.me' |
||||
|
); |
||||
|
return $qvmRegionHuadong; |
||||
|
} |
||||
|
|
||||
|
//华北机房内网上传 |
||||
|
public static function qvmRegionHuabei() |
||||
|
{ |
||||
|
$qvmRegionHuabei = new Region( |
||||
|
array("free-qvm-z1-zz.qiniup.com"), |
||||
|
"rs-z1.qbox.me", |
||||
|
"rsf-z1.qbox.me", |
||||
|
"api-z1.qiniu.com", |
||||
|
"iovip-z1.qbox.me" |
||||
|
); |
||||
|
return $qvmRegionHuabei; |
||||
|
} |
||||
|
|
||||
|
//华北机房 |
||||
|
public static function regionHuabei() |
||||
|
{ |
||||
|
$regionHuabei = new Region( |
||||
|
array('up-z1.qiniup.com'), |
||||
|
array('upload-z1.qiniup.com'), |
||||
|
"rs-z1.qbox.me", |
||||
|
"rsf-z1.qbox.me", |
||||
|
"api-z1.qiniu.com", |
||||
|
"iovip-z1.qbox.me" |
||||
|
); |
||||
|
|
||||
|
return $regionHuabei; |
||||
|
} |
||||
|
|
||||
|
//华南机房 |
||||
|
public static function regionHuanan() |
||||
|
{ |
||||
|
$regionHuanan = new Region( |
||||
|
array('up-z2.qiniup.com', 'up-dg.qiniup.com', 'up-fs.qiniup.com'), |
||||
|
array('upload-z2.qiniup.com', 'upload-dg.qiniup.com', 'upload-fs.qiniup.com'), |
||||
|
"rs-z2.qbox.me", |
||||
|
"rsf-z2.qbox.me", |
||||
|
"api-z2.qiniu.com", |
||||
|
"iovip-z2.qbox.me" |
||||
|
); |
||||
|
return $regionHuanan; |
||||
|
} |
||||
|
|
||||
|
//北美机房 |
||||
|
public static function regionNorthAmerica() |
||||
|
{ |
||||
|
//北美机房 |
||||
|
$regionNorthAmerica = new Region( |
||||
|
array('up-na0.qiniup.com'), |
||||
|
array('upload-na0.qiniup.com'), |
||||
|
"rs-na0.qbox.me", |
||||
|
"rsf-na0.qbox.me", |
||||
|
"api-na0.qiniu.com", |
||||
|
"iovip-na0.qbox.me" |
||||
|
); |
||||
|
return $regionNorthAmerica; |
||||
|
} |
||||
|
|
||||
|
//新加坡机房 |
||||
|
public static function regionSingapore() |
||||
|
{ |
||||
|
//新加坡机房 |
||||
|
$regionSingapore = new Region( |
||||
|
array('up-as0.qiniup.com'), |
||||
|
array('upload-as0.qiniup.com'), |
||||
|
"rs-as0.qbox.me", |
||||
|
"rsf-as0.qbox.me", |
||||
|
"api-as0.qiniu.com", |
||||
|
"iovip-as0.qbox.me" |
||||
|
); |
||||
|
return $regionSingapore; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* GET /v2/query?ak=<ak>&&bucket=<bucket> |
||||
|
**/ |
||||
|
public static function queryRegion($ak, $bucket) |
||||
|
{ |
||||
|
$Region = new Region(); |
||||
|
$url = Config::API_HOST . '/v2/query' . "?ak=$ak&bucket=$bucket"; |
||||
|
$ret = Client::Get($url); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
//parse Region; |
||||
|
|
||||
|
$iovipHost = $r['io']['src']['main'][0]; |
||||
|
$Region->iovipHost = $iovipHost; |
||||
|
$accMain = $r['up']['acc']['main'][0]; |
||||
|
array_push($Region->cdnUpHosts, $accMain); |
||||
|
if (isset($r['up']['acc']['backup'])) { |
||||
|
foreach ($r['up']['acc']['backup'] as $key => $value) { |
||||
|
array_push($Region->cdnUpHosts, $value); |
||||
|
} |
||||
|
} |
||||
|
$srcMain = $r['up']['src']['main'][0]; |
||||
|
array_push($Region->srcUpHosts, $srcMain); |
||||
|
if (isset($r['up']['src']['backup'])) { |
||||
|
foreach ($r['up']['src']['backup'] as $key => $value) { |
||||
|
array_push($Region->srcUpHosts, $value); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//set specific hosts |
||||
|
if (strstr($Region->iovipHost, "z1") !== false) { |
||||
|
$Region->rsHost = "rs-z1.qbox.me"; |
||||
|
$Region->rsfHost = "rsf-z1.qbox.me"; |
||||
|
$Region->apiHost = "api-z1.qiniu.com"; |
||||
|
} elseif (strstr($Region->iovipHost, "z2") !== false) { |
||||
|
$Region->rsHost = "rs-z2.qbox.me"; |
||||
|
$Region->rsfHost = "rsf-z2.qbox.me"; |
||||
|
$Region->apiHost = "api-z2.qiniu.com"; |
||||
|
} elseif (strstr($Region->iovipHost, "na0") !== false) { |
||||
|
$Region->rsHost = "rs-na0.qbox.me"; |
||||
|
$Region->rsfHost = "rsf-na0.qbox.me"; |
||||
|
$Region->apiHost = "api-na0.qiniu.com"; |
||||
|
} elseif (strstr($Region->iovipHost, "as0") !== false) { |
||||
|
$Region->rsHost = "rs-as0.qbox.me"; |
||||
|
$Region->rsfHost = "rsf-as0.qbox.me"; |
||||
|
$Region->apiHost = "api-as0.qiniu.com"; |
||||
|
} else { |
||||
|
$Region->rsHost = "rs.qbox.me"; |
||||
|
$Region->rsfHost = "rsf.qbox.me"; |
||||
|
$Region->apiHost = "api.qiniu.com"; |
||||
|
} |
||||
|
|
||||
|
return $Region; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,209 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Rtc; |
||||
|
|
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
class AppClient |
||||
|
{ |
||||
|
private $auth; |
||||
|
private $baseURL; |
||||
|
|
||||
|
public function __construct(Auth $auth) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
|
||||
|
$this->baseURL = sprintf("%s/%s/apps", Config::RTCAPI_HOST, Config::RTCAPI_VERSION); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 创建应用 |
||||
|
* hub: 直播空间名 |
||||
|
* title: app 的名称 注意,Title 不是唯一标识,重复 create 动作将生成多个 app |
||||
|
* maxUsers:人数限制 |
||||
|
* NoAutoKickUser: bool 类型,可选,禁止自动踢人(抢流)。默认为 false , |
||||
|
即同一个身份的 client (app/room/user) ,新的连麦请求可以成功,旧连接被关闭。 |
||||
|
*/ |
||||
|
public function createApp($hub, $title, $maxUsers = null, $noAutoKickUser = null) |
||||
|
{ |
||||
|
$params['hub'] = $hub; |
||||
|
$params['title'] = $title; |
||||
|
if (!empty($maxUsers)) { |
||||
|
$params['maxUsers'] = $maxUsers; |
||||
|
} |
||||
|
if ($noAutoKickUser !== null) { |
||||
|
$params['noAutoKickUser'] = $noAutoKickUser; |
||||
|
} |
||||
|
$body = json_encode($params); |
||||
|
$ret = $this->post($this->baseURL, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 更新应用 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
* Title: app 的名称, 可选。 |
||||
|
* Hub: 绑定的直播 hub,可选,用于合流后 rtmp 推流。 |
||||
|
* MaxUsers: int 类型,可选,连麦房间支持的最大在线人数。 |
||||
|
* NoAutoKickUser: bool 类型,可选,禁止自动踢人。 |
||||
|
* MergePublishRtmp: 连麦合流转推 RTMP 的配置,可选择。其详细配置包括如下 |
||||
|
Enable: 布尔类型,用于开启和关闭所有房间的合流功能。 |
||||
|
AudioOnly: 布尔类型,可选,指定是否只合成音频。 |
||||
|
Height, Width: int64,可选,指定合流输出的高和宽,默认为 640 x 480。 |
||||
|
OutputFps: int64,可选,指定合流输出的帧率,默认为 25 fps 。 |
||||
|
OutputKbps: int64,可选,指定合流输出的码率,默认为 1000 。 |
||||
|
URL: 合流后转推旁路直播的地址,可选,支持魔法变量配置按照连麦房间号生成不同的推流地址。如果是转推到七牛直播云,不建议使用该配置。 |
||||
|
StreamTitle: 转推七牛直播云的流名,可选,支持魔法变量配置按照连麦房间号生成不同的流名。例如,配置 Hub 为 qn-zhibo ,配置 StreamTitle 为 $(roomName) ,则房间 meeting-001 的合流将会被转推到 rtmp://pili-publish.qn-zhibo.***.com/qn-zhibo/meeting-001地址。详细配置细则,请咨询七牛技术支持。 |
||||
|
*/ |
||||
|
public function updateApp($appId, $hub, $title, $maxUsers = null, $mergePublishRtmp = null, $noAutoKickUser = null) |
||||
|
{ |
||||
|
$url = $this->baseURL . '/' . $appId; |
||||
|
$params['hub'] = $hub; |
||||
|
$params['title'] = $title; |
||||
|
if (!empty($maxUsers)) { |
||||
|
$params['maxUsers'] = $maxUsers; |
||||
|
} |
||||
|
if ($noAutoKickUser !== null) { |
||||
|
$params['noAutoKickUser'] = $noAutoKickUser; |
||||
|
} |
||||
|
if (!empty($mergePublishRtmp)) { |
||||
|
$params['mergePublishRtmp'] = $mergePublishRtmp; |
||||
|
} |
||||
|
$body = json_encode($params); |
||||
|
$ret = $this->post($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 获取应用信息 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
*/ |
||||
|
public function getApp($appId) |
||||
|
{ |
||||
|
$url = $this->baseURL . '/' . $appId; |
||||
|
$ret = $this->get($url); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 删除应用 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成 |
||||
|
*/ |
||||
|
public function deleteApp($appId) |
||||
|
{ |
||||
|
$url = $this->baseURL . '/' . $appId; |
||||
|
list(, $err) = $this->delete($url); |
||||
|
return $err; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 获取房间内用户列表 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
* roomName: 操作所查询的连麦房间。 |
||||
|
*/ |
||||
|
public function listUser($appId, $roomName) |
||||
|
{ |
||||
|
$url = sprintf("%s/%s/rooms/%s/users", $this->baseURL, $appId, $roomName); |
||||
|
$ret = $this->get($url); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 踢出用户 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
* roomName: 连麦房间 |
||||
|
* userId: 请求加入房间的用户ID |
||||
|
*/ |
||||
|
public function kickUser($appId, $roomName, $userId) |
||||
|
{ |
||||
|
$url = sprintf("%s/%s/rooms/%s/users/%s", $this->baseURL, $appId, $roomName, $userId); |
||||
|
list(, $err) = $this->delete($url); |
||||
|
return $err; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 获取应用中活跃房间 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
* prefix: 所查询房间名的前缀索引,可以为空。 |
||||
|
* offset: int 类型,分页查询的位移标记。 |
||||
|
* limit: int 类型,此次查询的最大长度。 |
||||
|
* GET /v3/apps/<AppID>/rooms?prefix=<RoomNamePrefix>&offset=<Offset>&limit=<Limit> |
||||
|
*/ |
||||
|
public function listActiveRooms($appId, $prefix = null, $offset = null, $limit = null) |
||||
|
{ |
||||
|
if (isset($prefix)) { |
||||
|
$query['prefix'] = $prefix; |
||||
|
} |
||||
|
if (isset($offset)) { |
||||
|
$query['offset'] = $offset; |
||||
|
} |
||||
|
if (isset($limit)) { |
||||
|
$query['limit'] = $limit; |
||||
|
} |
||||
|
if (isset($query) && !empty($query)) { |
||||
|
$query = '?' . http_build_query($query); |
||||
|
$url = sprintf("%s/%s/rooms%s", $this->baseURL, $appId, $query); |
||||
|
} else { |
||||
|
$url = sprintf("%s/%s/rooms", $this->baseURL, $appId); |
||||
|
} |
||||
|
$ret = $this->get($url); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 生成加入房间的令牌 |
||||
|
* appId: app 的唯一标识,创建的时候由系统生成。 |
||||
|
* roomName: 房间名称,需满足规格 ^[a-zA-Z0-9_-]{3,64}$ |
||||
|
* userId: 请求加入房间的用户 ID,需满足规格 ^[a-zA-Z0-9_-]{3,50}$ |
||||
|
* expireAt: int64 类型,鉴权的有效时间,传入以秒为单位的64位Unix |
||||
|
绝对时间,token 将在该时间后失效。 |
||||
|
* permission: 该用户的房间管理权限,"admin" 或 "user",默认为 "user" 。 |
||||
|
当权限角色为 "admin" 时,拥有将其他用户移除出房间等特权. |
||||
|
*/ |
||||
|
public function appToken($appId, $roomName, $userId, $expireAt, $permission) |
||||
|
{ |
||||
|
$params['appId'] = $appId; |
||||
|
$params['userId'] = $userId; |
||||
|
$params['roomName'] = $roomName; |
||||
|
$params['permission'] = $permission; |
||||
|
$params['expireAt'] = $expireAt; |
||||
|
$appAccessString = json_encode($params); |
||||
|
return $this->auth->signWithData($appAccessString); |
||||
|
} |
||||
|
|
||||
|
private function get($url, $cType = null) |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "GET", null, $cType); |
||||
|
$rtcToken['Content-Type'] = $cType; |
||||
|
$ret = Client::get($url, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
return array($ret->json(), null); |
||||
|
} |
||||
|
|
||||
|
private function delete($url, $contentType = 'application/json') |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "DELETE", null, $contentType); |
||||
|
$rtcToken['Content-Type'] = $contentType; |
||||
|
$ret = Client::delete($url, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
return array($ret->json(), null); |
||||
|
} |
||||
|
|
||||
|
private function post($url, $body, $contentType = 'application/json') |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "POST", $body, $contentType); |
||||
|
$rtcToken['Content-Type'] = $contentType; |
||||
|
$ret = Client::post($url, $body, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
return array($r, null); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,337 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Sms; |
||||
|
|
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Auth; |
||||
|
|
||||
|
class Sms |
||||
|
{ |
||||
|
private $auth; |
||||
|
private $baseURL; |
||||
|
|
||||
|
public function __construct(Auth $auth) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
|
||||
|
$this->baseURL = sprintf("%s/%s/", Config::SMS_HOST, Config::SMS_VERSION); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 创建签名 |
||||
|
* signature: string 类型,必填,【长度限制8个字符内】超过长度会报错 |
||||
|
* source: string 类型,必填,申请签名时必须指定签名来源。取值范围为: |
||||
|
nterprises_and_institutions 企事业单位的全称或简称 |
||||
|
website 工信部备案网站的全称或简称 |
||||
|
app APP应用的全称或简称 |
||||
|
public_number_or_small_program 公众号或小程序的全称或简称 |
||||
|
store_name 电商平台店铺名的全称或简称 |
||||
|
trade_name 商标名的全称或简称, |
||||
|
* pics: 本地的图片路径 string 类型,可选 |
||||
|
*@return: 类型array { |
||||
|
"signature_id": <signature_id> |
||||
|
} |
||||
|
*/ |
||||
|
public function createSignature($signature, $source, $pics = null) |
||||
|
{ |
||||
|
$params['signature'] = $signature; |
||||
|
$params['source'] = $source; |
||||
|
if (!empty($pics)) { |
||||
|
$params['pics'] = $this->imgToBase64($pics); |
||||
|
} |
||||
|
$body = json_encode($params); |
||||
|
$url =$this->baseURL.'signature'; |
||||
|
$ret = $this->post($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 编辑签名 |
||||
|
* id 签名id : string 类型,必填, |
||||
|
* signature: string 类型,必填, |
||||
|
* source: string 类型,必填,申请签名时必须指定签名来源。取值范围为: |
||||
|
enterprises_and_institutions 企事业单位的全称或简称 |
||||
|
website 工信部备案网站的全称或简称 |
||||
|
app APP应用的全称或简称 |
||||
|
public_number_or_small_program 公众号或小程序的全称或简称 |
||||
|
store_name 电商平台店铺名的全称或简称 |
||||
|
trade_name 商标名的全称或简称, |
||||
|
* pics: 本地的图片路径 string 类型,可选, |
||||
|
* @return: 类型array { |
||||
|
"signature": string |
||||
|
} |
||||
|
*/ |
||||
|
public function updateSignature($id, $signature, $source, $pics = null) |
||||
|
{ |
||||
|
$params['signature'] = $signature; |
||||
|
$params['source'] = $source; |
||||
|
if (!empty($pics)) { |
||||
|
$params['pics'] = $this->imgToBase64($pics); |
||||
|
} |
||||
|
$body = json_encode($params); |
||||
|
$url =$this->baseURL.'signature/'.$id; |
||||
|
$ret = $this->PUT($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 查询签名 |
||||
|
* audit_status: 审核状态 string 类型,可选, |
||||
|
取值范围为: "passed"(通过), "rejected"(未通过), "reviewing"(审核中) |
||||
|
* page:页码 int 类型, |
||||
|
* page_size: 分页大小 int 类型,可选, 默认为20 |
||||
|
*@return: 类型array { |
||||
|
"items": [{ |
||||
|
"id": string, |
||||
|
"signature": string, |
||||
|
"source": string, |
||||
|
"audit_status": string, |
||||
|
"reject_reason": string, |
||||
|
"created_at": int64, |
||||
|
"updated_at": int64 |
||||
|
}...], |
||||
|
"total": int, |
||||
|
"page": int, |
||||
|
"page_size": int, |
||||
|
} |
||||
|
*/ |
||||
|
public function checkSignature($audit_status = null, $page = 1, $page_size = 20) |
||||
|
{ |
||||
|
|
||||
|
$url = sprintf( |
||||
|
"%s?audit_status=%s&page=%s&page_size=%s", |
||||
|
$this->baseURL.'signature', |
||||
|
$audit_status, |
||||
|
$page, |
||||
|
$page_size |
||||
|
); |
||||
|
$ret = $this->get($url); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* 删除签名 |
||||
|
* id 签名id string 类型,必填, |
||||
|
* @retrun : 请求成功 HTTP 状态码为 200 |
||||
|
*/ |
||||
|
public function deleteSignature($id) |
||||
|
{ |
||||
|
$url = $this->baseURL . 'signature/' . $id; |
||||
|
list(, $err) = $this->delete($url); |
||||
|
return $err; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* 创建模板 |
||||
|
* name : 模板名称 string 类型 ,必填 |
||||
|
* template: 模板内容 string 类型,必填 |
||||
|
* type: 模板类型 string 类型,必填, |
||||
|
取值范围为: notification (通知类短信), verification (验证码短信), marketing (营销类短信) |
||||
|
* description: 申请理由简述 string 类型,必填 |
||||
|
* signature_id: 已经审核通过的签名 string 类型,必填 |
||||
|
* @return: 类型 array { |
||||
|
"template_id": string |
||||
|
} |
||||
|
*/ |
||||
|
public function createTemplate( |
||||
|
$name, |
||||
|
$template, |
||||
|
$type, |
||||
|
$description, |
||||
|
$signture_id |
||||
|
) { |
||||
|
$params['name'] = $name; |
||||
|
$params['template'] = $template; |
||||
|
$params['type'] = $type; |
||||
|
$params['description'] = $description; |
||||
|
$params['signature_id'] = $signture_id; |
||||
|
|
||||
|
$body = json_encode($params); |
||||
|
$url =$this->baseURL.'template'; |
||||
|
$ret = $this->post($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 查询模板 |
||||
|
* audit_status: 审核状态 string 类型 ,可选, |
||||
|
取值范围为: passed (通过), rejected (未通过), reviewing (审核中) |
||||
|
* page: 页码 int 类型,可选,默认为 1 |
||||
|
* page_size: 分页大小 int 类型,可选,默认为 20 |
||||
|
* @return: 类型array{ |
||||
|
"items": [{ |
||||
|
"id": string, |
||||
|
"name": string, |
||||
|
"template": string, |
||||
|
"audit_status": string, |
||||
|
"reject_reason": string, |
||||
|
"type": string, |
||||
|
"signature_id": string, // 模版绑定的签名ID |
||||
|
"signature_text": string, // 模版绑定的签名内容 |
||||
|
"created_at": int64, |
||||
|
"updated_at": int64 |
||||
|
}...], |
||||
|
"total": int, |
||||
|
"page": int, |
||||
|
"page_size": int |
||||
|
} |
||||
|
*/ |
||||
|
public function queryTemplate($audit_status = null, $page = 1, $page_size = 20) |
||||
|
{ |
||||
|
|
||||
|
$url = sprintf( |
||||
|
"%s?audit_status=%s&page=%s&page_size=%s", |
||||
|
$this->baseURL.'template', |
||||
|
$audit_status, |
||||
|
$page, |
||||
|
$page_size |
||||
|
); |
||||
|
$ret = $this->get($url); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 编辑模板 |
||||
|
* id :模板id |
||||
|
* name : 模板名称 string 类型 ,必填 |
||||
|
* template: 模板内容 string 类型,必填 |
||||
|
* description: 申请理由简述 string 类型,必填 |
||||
|
* signature_id: 已经审核通过的签名 string 类型,必填 |
||||
|
* @retrun : 请求成功 HTTP 状态码为 200 |
||||
|
*/ |
||||
|
public function updateTemplate( |
||||
|
$id, |
||||
|
$name, |
||||
|
$template, |
||||
|
$description, |
||||
|
$signature_id |
||||
|
) { |
||||
|
$params['name'] = $name; |
||||
|
$params['template'] = $template; |
||||
|
$params['description'] = $description; |
||||
|
$params['signature_id'] = $signature_id; |
||||
|
$body = json_encode($params); |
||||
|
$url =$this->baseURL.'template/'.$id; |
||||
|
$ret = $this->PUT($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 删除模板 |
||||
|
* id :模板id string 类型,必填, |
||||
|
* @retrun : 请求成功 HTTP 状态码为 200 |
||||
|
*/ |
||||
|
public function deleteTemplate($id) |
||||
|
{ |
||||
|
$url = $this->baseURL . 'template/' . $id; |
||||
|
list(, $err) = $this->delete($url); |
||||
|
return $err; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* 发送短信 |
||||
|
* 编辑模板 |
||||
|
* template_id :模板id string类型,必填 |
||||
|
* mobiles : 手机号数组 []string 类型 ,必填 |
||||
|
* parameters: 模板内容 map[string]string 类型,可选 |
||||
|
* @return: 类型json { |
||||
|
"job_id": string |
||||
|
} |
||||
|
*/ |
||||
|
public function sendMessage($template_id, $mobiles, $parameters = null) |
||||
|
{ |
||||
|
$params['template_id'] = $template_id; |
||||
|
$params['mobiles'] = $mobiles; |
||||
|
if (!empty($parameters)) { |
||||
|
$params['parameters'] = $parameters; |
||||
|
} |
||||
|
$body = json_encode($params); |
||||
|
$url =$this->baseURL.'message'; |
||||
|
$ret = $this->post($url, $body); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
public function imgToBase64($img_file) |
||||
|
{ |
||||
|
$img_base64 = ''; |
||||
|
if (file_exists($img_file)) { |
||||
|
$app_img_file = $img_file; // 图片路径 |
||||
|
$img_info = getimagesize($app_img_file); // 取得图片的大小,类型等 |
||||
|
$fp = fopen($app_img_file, "r"); // 图片是否可读权限 |
||||
|
if ($fp) { |
||||
|
$filesize = filesize($app_img_file); |
||||
|
if ($filesize > 5*1024*1024) { |
||||
|
die("pic size < 5M !"); |
||||
|
} |
||||
|
$content = fread($fp, $filesize); |
||||
|
$file_content = chunk_split(base64_encode($content)); // base64编码 |
||||
|
switch ($img_info[2]) { //判读图片类型 |
||||
|
case 1: |
||||
|
$img_type = 'gif'; |
||||
|
break; |
||||
|
case 2: |
||||
|
$img_type = 'jpg'; |
||||
|
break; |
||||
|
case 3: |
||||
|
$img_type = 'png'; |
||||
|
break; |
||||
|
} |
||||
|
//合成图片的base64编码 |
||||
|
$img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content; |
||||
|
} |
||||
|
fclose($fp); |
||||
|
} |
||||
|
|
||||
|
return $img_base64; |
||||
|
} |
||||
|
|
||||
|
private function get($url, $cType = null) |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "GET", null, $cType); |
||||
|
$rtcToken['Content-Type'] = $cType; |
||||
|
$ret = Client::get($url, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
return array($ret->json(), null); |
||||
|
} |
||||
|
|
||||
|
private function delete($url, $contentType = 'application/json') |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "DELETE", null, $contentType); |
||||
|
$rtcToken['Content-Type'] = $contentType; |
||||
|
$ret = Client::delete($url, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
return array($ret->json(), null); |
||||
|
} |
||||
|
|
||||
|
private function post($url, $body, $contentType = 'application/json') |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "POST", $body, $contentType); |
||||
|
$rtcToken['Content-Type'] = $contentType; |
||||
|
$ret = Client::post($url, $body, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
return array($r, null); |
||||
|
} |
||||
|
private function PUT($url, $body, $contentType = 'application/json') |
||||
|
{ |
||||
|
$rtcToken = $this->auth->authorizationV2($url, "PUT", $body, $contentType); |
||||
|
$rtcToken['Content-Type'] = $contentType; |
||||
|
$ret = Client::put($url, $body, $rtcToken); |
||||
|
if (!$ret->ok()) { |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
return array($r, null); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,73 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Storage; |
||||
|
|
||||
|
use Qiniu\Auth; |
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Zone; |
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
|
||||
|
/** |
||||
|
* 主要涉及了鉴黄接口的实现,具体的接口规格可以参考 |
||||
|
* |
||||
|
* @link https://developer.qiniu.com/dora/manual/3674/kodo-product-introduction |
||||
|
*/ |
||||
|
final class ArgusManager |
||||
|
{ |
||||
|
private $auth; |
||||
|
private $config; |
||||
|
|
||||
|
public function __construct(Auth $auth, Config $config = null) |
||||
|
{ |
||||
|
$this->auth = $auth; |
||||
|
if ($config == null) { |
||||
|
$this->config = new Config(); |
||||
|
} else { |
||||
|
$this->config = $config; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 视频鉴黄 |
||||
|
* |
||||
|
* @param $body body信息 |
||||
|
* @param $vid videoID |
||||
|
* |
||||
|
* @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error |
||||
|
* @link https://developer.qiniu.com/dora/manual/4258/video-pulp |
||||
|
*/ |
||||
|
public function pulpVideo($body, $vid) |
||||
|
{ |
||||
|
$path = '/v1/video/' . $vid; |
||||
|
|
||||
|
return $this->arPost($path, $body); |
||||
|
} |
||||
|
|
||||
|
private function getArHost() |
||||
|
{ |
||||
|
$scheme = "http://"; |
||||
|
if ($this->config->useHTTPS == true) { |
||||
|
$scheme = "https://"; |
||||
|
} |
||||
|
return $scheme . Config::ARGUS_HOST; |
||||
|
} |
||||
|
|
||||
|
private function arPost($path, $body = null) |
||||
|
{ |
||||
|
$url = $this->getArHost() . $path; |
||||
|
return $this->post($url, $body); |
||||
|
} |
||||
|
|
||||
|
private function post($url, $body) |
||||
|
{ |
||||
|
$headers = $this->auth->authorizationV2($url, 'POST', $body, 'application/json'); |
||||
|
$headers['Content-Type']='application/json'; |
||||
|
$ret = Client::post($url, $body, $headers); |
||||
|
if (!$ret->ok()) { |
||||
|
print($ret->statusCode); |
||||
|
return array(null, new Error($url, $ret)); |
||||
|
} |
||||
|
$r = ($ret->body === null) ? array() : $ret->json(); |
||||
|
return array($r, null); |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,137 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Storage; |
||||
|
|
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
|
||||
|
final class FormUploader |
||||
|
{ |
||||
|
|
||||
|
/** |
||||
|
* 上传二进制流到七牛, 内部使用 |
||||
|
* |
||||
|
* @param $upToken 上传凭证 |
||||
|
* @param $key 上传文件名 |
||||
|
* @param $data 上传二进制流 |
||||
|
* @param $config 上传配置 |
||||
|
* @param $params 自定义变量,规格参考 |
||||
|
* http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar |
||||
|
* @param $mime 上传数据的mimeType |
||||
|
* |
||||
|
* @return array 包含已上传文件的信息,类似: |
||||
|
* [ |
||||
|
* "hash" => "<Hash string>", |
||||
|
* "key" => "<Key string>" |
||||
|
* ] |
||||
|
*/ |
||||
|
public static function put( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$data, |
||||
|
$config, |
||||
|
$params, |
||||
|
$mime, |
||||
|
$fname |
||||
|
) { |
||||
|
$fields = array('token' => $upToken); |
||||
|
if ($key === null) { |
||||
|
} else { |
||||
|
$fields['key'] = $key; |
||||
|
} |
||||
|
|
||||
|
//enable crc32 check by default |
||||
|
$fields['crc32'] = \Qiniu\crc32_data($data); |
||||
|
|
||||
|
if ($params) { |
||||
|
foreach ($params as $k => $v) { |
||||
|
$fields[$k] = $v; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); |
||||
|
if ($err != null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
|
||||
|
$upHost = $config->getUpHost($accessKey, $bucket); |
||||
|
|
||||
|
$response = Client::multipartPost($upHost, $fields, 'file', $fname, $data, $mime); |
||||
|
if (!$response->ok()) { |
||||
|
return array(null, new Error($upHost, $response)); |
||||
|
} |
||||
|
return array($response->json(), null); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 上传文件到七牛,内部使用 |
||||
|
* |
||||
|
* @param $upToken 上传凭证 |
||||
|
* @param $key 上传文件名 |
||||
|
* @param $filePath 上传文件的路径 |
||||
|
* @param $config 上传配置 |
||||
|
* @param $params 自定义变量,规格参考 |
||||
|
* http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar |
||||
|
* @param $mime 上传数据的mimeType |
||||
|
* |
||||
|
* @return array 包含已上传文件的信息,类似: |
||||
|
* [ |
||||
|
* "hash" => "<Hash string>", |
||||
|
* "key" => "<Key string>" |
||||
|
* ] |
||||
|
*/ |
||||
|
public static function putFile( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$filePath, |
||||
|
$config, |
||||
|
$params, |
||||
|
$mime |
||||
|
) { |
||||
|
|
||||
|
|
||||
|
$fields = array('token' => $upToken, 'file' => self::createFile($filePath, $mime)); |
||||
|
if ($key !== null) { |
||||
|
$fields['key'] = $key; |
||||
|
} |
||||
|
|
||||
|
$fields['crc32'] = \Qiniu\crc32_file($filePath); |
||||
|
|
||||
|
if ($params) { |
||||
|
foreach ($params as $k => $v) { |
||||
|
$fields[$k] = $v; |
||||
|
} |
||||
|
} |
||||
|
$fields['key'] = $key; |
||||
|
$headers = array('Content-Type' => 'multipart/form-data'); |
||||
|
|
||||
|
list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); |
||||
|
if ($err != null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
|
||||
|
$upHost = $config->getUpHost($accessKey, $bucket); |
||||
|
|
||||
|
$response = Client::post($upHost, $fields, $headers); |
||||
|
if (!$response->ok()) { |
||||
|
return array(null, new Error($upHost, $response)); |
||||
|
} |
||||
|
return array($response->json(), null); |
||||
|
} |
||||
|
|
||||
|
private static function createFile($filename, $mime) |
||||
|
{ |
||||
|
// PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax |
||||
|
// See: https://wiki.php.net/rfc/curl-file-upload |
||||
|
if (function_exists('curl_file_create')) { |
||||
|
return curl_file_create($filename, $mime); |
||||
|
} |
||||
|
|
||||
|
// Use the old style if using an older version of PHP |
||||
|
$value = "@{$filename}"; |
||||
|
if (!empty($mime)) { |
||||
|
$value .= ';type=' . $mime; |
||||
|
} |
||||
|
|
||||
|
return $value; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,169 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Storage; |
||||
|
|
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Http\Client; |
||||
|
use Qiniu\Http\Error; |
||||
|
|
||||
|
/** |
||||
|
* 断点续上传类, 该类主要实现了断点续上传中的分块上传, |
||||
|
* 以及相应地创建块和创建文件过程. |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/up/mkblk.html |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/up/mkfile.html |
||||
|
*/ |
||||
|
final class ResumeUploader |
||||
|
{ |
||||
|
private $upToken; |
||||
|
private $key; |
||||
|
private $inputStream; |
||||
|
private $size; |
||||
|
private $params; |
||||
|
private $mime; |
||||
|
private $contexts; |
||||
|
private $host; |
||||
|
private $currentUrl; |
||||
|
private $config; |
||||
|
|
||||
|
/** |
||||
|
* 上传二进制流到七牛 |
||||
|
* |
||||
|
* @param $upToken 上传凭证 |
||||
|
* @param $key 上传文件名 |
||||
|
* @param $inputStream 上传二进制流 |
||||
|
* @param $size 上传流的大小 |
||||
|
* @param $params 自定义变量 |
||||
|
* @param $mime 上传数据的mimeType |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar |
||||
|
*/ |
||||
|
public function __construct( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$inputStream, |
||||
|
$size, |
||||
|
$params, |
||||
|
$mime, |
||||
|
$config |
||||
|
) { |
||||
|
|
||||
|
$this->upToken = $upToken; |
||||
|
$this->key = $key; |
||||
|
$this->inputStream = $inputStream; |
||||
|
$this->size = $size; |
||||
|
$this->params = $params; |
||||
|
$this->mime = $mime; |
||||
|
$this->contexts = array(); |
||||
|
$this->config = $config; |
||||
|
|
||||
|
list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); |
||||
|
if ($err != null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
|
||||
|
$upHost = $config->getUpHost($accessKey, $bucket); |
||||
|
if ($err != null) { |
||||
|
throw new \Exception($err->message(), 1); |
||||
|
} |
||||
|
$this->host = $upHost; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 上传操作 |
||||
|
*/ |
||||
|
public function upload($fname) |
||||
|
{ |
||||
|
$uploaded = 0; |
||||
|
while ($uploaded < $this->size) { |
||||
|
$blockSize = $this->blockSize($uploaded); |
||||
|
$data = fread($this->inputStream, $blockSize); |
||||
|
if ($data === false) { |
||||
|
throw new \Exception("file read failed", 1); |
||||
|
} |
||||
|
$crc = \Qiniu\crc32_data($data); |
||||
|
$response = $this->makeBlock($data, $blockSize); |
||||
|
$ret = null; |
||||
|
if ($response->ok() && $response->json() != null) { |
||||
|
$ret = $response->json(); |
||||
|
} |
||||
|
if ($response->statusCode < 0) { |
||||
|
list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($this->upToken); |
||||
|
if ($err != null) { |
||||
|
return array(null, $err); |
||||
|
} |
||||
|
|
||||
|
$upHostBackup = $this->config->getUpBackupHost($accessKey, $bucket); |
||||
|
$this->host = $upHostBackup; |
||||
|
} |
||||
|
if ($response->needRetry() || !isset($ret['crc32']) || $crc != $ret['crc32']) { |
||||
|
$response = $this->makeBlock($data, $blockSize); |
||||
|
$ret = $response->json(); |
||||
|
} |
||||
|
|
||||
|
if (!$response->ok() || !isset($ret['crc32']) || $crc != $ret['crc32']) { |
||||
|
return array(null, new Error($this->currentUrl, $response)); |
||||
|
} |
||||
|
array_push($this->contexts, $ret['ctx']); |
||||
|
$uploaded += $blockSize; |
||||
|
} |
||||
|
return $this->makeFile($fname); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 创建块 |
||||
|
*/ |
||||
|
private function makeBlock($block, $blockSize) |
||||
|
{ |
||||
|
$url = $this->host . '/mkblk/' . $blockSize; |
||||
|
return $this->post($url, $block); |
||||
|
} |
||||
|
|
||||
|
private function fileUrl($fname) |
||||
|
{ |
||||
|
$url = $this->host . '/mkfile/' . $this->size; |
||||
|
$url .= '/mimeType/' . \Qiniu\base64_urlSafeEncode($this->mime); |
||||
|
if ($this->key != null) { |
||||
|
$url .= '/key/' . \Qiniu\base64_urlSafeEncode($this->key); |
||||
|
} |
||||
|
$url .= '/fname/' . \Qiniu\base64_urlSafeEncode($fname); |
||||
|
if (!empty($this->params)) { |
||||
|
foreach ($this->params as $key => $value) { |
||||
|
$val = \Qiniu\base64_urlSafeEncode($value); |
||||
|
$url .= "/$key/$val"; |
||||
|
} |
||||
|
} |
||||
|
return $url; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 创建文件 |
||||
|
*/ |
||||
|
private function makeFile($fname) |
||||
|
{ |
||||
|
$url = $this->fileUrl($fname); |
||||
|
$body = implode(',', $this->contexts); |
||||
|
$response = $this->post($url, $body); |
||||
|
if ($response->needRetry()) { |
||||
|
$response = $this->post($url, $body); |
||||
|
} |
||||
|
if (!$response->ok()) { |
||||
|
return array(null, new Error($this->currentUrl, $response)); |
||||
|
} |
||||
|
return array($response->json(), null); |
||||
|
} |
||||
|
|
||||
|
private function post($url, $data) |
||||
|
{ |
||||
|
$this->currentUrl = $url; |
||||
|
$headers = array('Authorization' => 'UpToken ' . $this->upToken); |
||||
|
return Client::post($url, $data, $headers); |
||||
|
} |
||||
|
|
||||
|
private function blockSize($uploaded) |
||||
|
{ |
||||
|
if ($this->size < $uploaded + Config::BLOCK_SIZE) { |
||||
|
return $this->size - $uploaded; |
||||
|
} |
||||
|
return Config::BLOCK_SIZE; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,144 @@ |
|||||
|
<?php |
||||
|
namespace Qiniu\Storage; |
||||
|
|
||||
|
use Qiniu\Config; |
||||
|
use Qiniu\Http\HttpClient; |
||||
|
use Qiniu\Storage\ResumeUploader; |
||||
|
use Qiniu\Storage\FormUploader; |
||||
|
|
||||
|
/** |
||||
|
* 主要涉及了资源上传接口的实现 |
||||
|
* |
||||
|
* @link http://developer.qiniu.com/docs/v6/api/reference/up/ |
||||
|
*/ |
||||
|
final class UploadManager |
||||
|
{ |
||||
|
private $config; |
||||
|
|
||||
|
public function __construct(Config $config = null) |
||||
|
{ |
||||
|
if ($config === null) { |
||||
|
$config = new Config(); |
||||
|
} |
||||
|
$this->config = $config; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 上传二进制流到七牛 |
||||
|
* |
||||
|
* @param $upToken 上传凭证 |
||||
|
* @param $key 上传文件名 |
||||
|
* @param $data 上传二进制流 |
||||
|
* @param $params 自定义变量,规格参考 |
||||
|
* http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar |
||||
|
* @param $mime 上传数据的mimeType |
||||
|
* @param $checkCrc 是否校验crc32 |
||||
|
* |
||||
|
* @return array 包含已上传文件的信息,类似: |
||||
|
* [ |
||||
|
* "hash" => "<Hash string>", |
||||
|
* "key" => "<Key string>" |
||||
|
* ] |
||||
|
*/ |
||||
|
public function put( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$data, |
||||
|
$params = null, |
||||
|
$mime = 'application/octet-stream', |
||||
|
$fname = "default_filename" |
||||
|
) { |
||||
|
|
||||
|
$params = self::trimParams($params); |
||||
|
return FormUploader::put( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$data, |
||||
|
$this->config, |
||||
|
$params, |
||||
|
$mime, |
||||
|
$fname |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 上传文件到七牛 |
||||
|
* |
||||
|
* @param $upToken 上传凭证 |
||||
|
* @param $key 上传文件名 |
||||
|
* @param $filePath 上传文件的路径 |
||||
|
* @param $params 自定义变量,规格参考 |
||||
|
* http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar |
||||
|
* @param $mime 上传数据的mimeType |
||||
|
* @param $checkCrc 是否校验crc32 |
||||
|
* |
||||
|
* @return array 包含已上传文件的信息,类似: |
||||
|
* [ |
||||
|
* "hash" => "<Hash string>", |
||||
|
* "key" => "<Key string>" |
||||
|
* ] |
||||
|
*/ |
||||
|
public function putFile( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$filePath, |
||||
|
$params = null, |
||||
|
$mime = 'application/octet-stream', |
||||
|
$checkCrc = false |
||||
|
) { |
||||
|
|
||||
|
$file = fopen($filePath, 'rb'); |
||||
|
if ($file === false) { |
||||
|
throw new \Exception("file can not open", 1); |
||||
|
} |
||||
|
$params = self::trimParams($params); |
||||
|
$stat = fstat($file); |
||||
|
$size = $stat['size']; |
||||
|
if ($size <= Config::BLOCK_SIZE) { |
||||
|
$data = fread($file, $size); |
||||
|
fclose($file); |
||||
|
if ($data === false) { |
||||
|
throw new \Exception("file can not read", 1); |
||||
|
} |
||||
|
return FormUploader::put( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$data, |
||||
|
$this->config, |
||||
|
$params, |
||||
|
$mime, |
||||
|
basename($filePath) |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
$up = new ResumeUploader( |
||||
|
$upToken, |
||||
|
$key, |
||||
|
$file, |
||||
|
$size, |
||||
|
$params, |
||||
|
$mime, |
||||
|
$this->config |
||||
|
); |
||||
|
$ret = $up->upload(basename($filePath)); |
||||
|
fclose($file); |
||||
|
return $ret; |
||||
|
} |
||||
|
|
||||
|
public static function trimParams($params) |
||||
|
{ |
||||
|
if ($params === null) { |
||||
|
return null; |
||||
|
} |
||||
|
$ret = array(); |
||||
|
foreach ($params as $k => $v) { |
||||
|
$pos1 = strpos($k, 'x:'); |
||||
|
$pos2 = strpos($k, 'x-qn-meta-'); |
||||
|
if (($pos1 === 0 || $pos2 === 0) && !empty($v)) { |
||||
|
$ret[$k] = $v; |
||||
|
} |
||||
|
} |
||||
|
return $ret; |
||||
|
} |
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue