導航:首頁 > 源碼編譯 > 七牛雲指南源碼

七牛雲指南源碼

發布時間:2022-06-22 21:01:35

Ⅰ 七牛雲存儲的音頻水印怎麼加php版本的

此 SDK 適用於 PHP 5.1.0 及其以上版本。基於 七牛雲存儲官方API 構建。使用此 SDK 構建您的網路應用程序,能讓您以非常便捷地方式將數據安全地存儲到七牛雲存儲上。無論您的網路應用是一個網站程序,還是包括從雲端(服務端程序)到終端(手持設備應用)的架構的服務或應用,通過七牛雲存儲及其 SDK,都能讓您應用程序的終端用戶高速上傳和下載,同時也讓您的服務端更加輕盈。
SDK源碼地址:https://github.com/qiniu/php-sdk/tags
應用接入
獲取Access Key 和 Secret Key
資源管理介面
1 查看單個文件屬性信息
2 復制單個文件
3 移動單個文件
4 刪除單個文件
上傳下載介面
1 文件上傳
1.1 上傳流程
1.2 上傳策略
2 文件下載
2.1 公有資源下載
2.2 私有資源下載
數據處理介面
1 圖像
1.1 查看圖像屬性
1.2 查看圖片EXIF信息
1.3 生成圖片預覽
貢獻代碼
許可證
應用接入
1. 獲取Access Key 和 Secret Key
要接入七牛雲存儲,您需要擁有一對有效的 Access Key 和 Secret Key 用來進行簽名認證。可以通過如下步驟獲得:
開通七牛開發者帳號
登錄七牛開發者自助平台,查看 Access Key 和 Secret Key 。
資源管理介面
1.查看單個文件屬性信息
示例代碼如下:
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key = "pic.jpg";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$client = new Qiniu_MacHttpClient(null);
list($ret, $err) = Qiniu_RS_Stat($client, $bucket, $key);
echo "Qiniu_RS_Stat result: \n";
if ($err !== null) {
var_mp($err);
} else {
var_mp($ret);
}
2. 復制單個文件
示例代碼如下:
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key = "pic.jpg";
$key1 = "file_name1";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$client = new Qiniu_MacHttpClient(null);
$err = Qiniu_RS_Copy($client, $bucket, $key, $bucket, $key1);
echo "====> Qiniu_RS_Copy result: \n";
if ($err !== null) {
var_mp($err);
} else {
echo "Success!";
}
3. 移動單個文件
示例代碼如下:
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key = "pic.jpg";
$key1 = "file_name1";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$client = new Qiniu_MacHttpClient(null);
$err = Qiniu_RS_Move($client, $bucket, $key, $bucket, $key1);
echo "====> Qiniu_RS_Move result: \n";
if ($err !== null) {
var_mp($err);
} else {
echo "Success!";
}
4. 刪除單個文件
示例代碼如下:
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key1 = "file_name1";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$client = new Qiniu_MacHttpClient(null);
$err = Qiniu_RS_Delete($client, $bucket, $key1);
echo "====> Qiniu_RS_Delete result: \n";
if ($err !== null) {
var_mp($err);
} else {
echo "Success!";
}
上傳下載介面
###1. 文件上傳
為了盡可能地改善終端用戶的上傳體驗,七牛雲存儲首創了客戶端直傳功能。一般雲存儲的上傳流程是:
客戶端(終端用戶) => 業務伺服器 => 雲存儲服務
這樣多了一次上傳的流程,和本地存儲相比,會相對慢一些。但七牛引入了客戶端直傳,將整個上傳過程調整為:
客戶端(終端用戶) => 七牛 => 業務伺服器
客戶端(終端用戶)直接上傳到七牛的伺服器,通過DNS智能解析,七牛會選擇到離終端用戶最近的ISP服務商節點,速度會比本地存儲快很多。文件上傳成功以後,七牛的伺服器使用回調功能,只需要將非常少的數據(比如Key)傳給應用伺服器,應用伺服器進行保存即可。
1.1上傳流程
在七牛雲存儲中,整個上傳流程大體分為這樣幾步:
業務伺服器頒發 uptoken(上傳授權憑證)給客戶端(終端用戶)
客戶端憑借 uptoken 上傳文件到七牛
在七牛獲得完整數據後,發起一個 HTTP 請求回調到業務伺服器
業務伺服器保存相關信息,並返回一些信息給七牛
七牛原封不動地將這些信息轉發給客戶端(終端用戶)
需要注意的是,回調到業務伺服器的過程是可選的,它取決於業務伺服器頒發的 uptoken。如果沒有回調,七牛會返回一些標準的信息(比如文件的 hash)給客戶端。如果上傳發生在業務伺服器,以上流程可以自然簡化為:
業務伺服器生成 uptoken(不設置回調,自己回調到自己這里沒有意義)
憑借 uptoken 上傳文件到七牛
善後工作,比如保存相關的一些信息
服務端生成 uptoken 代碼如下:
require_once("qiniu/rs.php");
$bucket = 'phpsdk';
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
$upToken = $putPolicy->Token(null);
上傳文件到七牛(通常是客戶端完成,但也可以發生在服務端):
上傳字元串
require_once("qiniu/io.php");
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key1 = "file_name1";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
$upToken = $putPolicy->Token(null);
list($ret, $err) = Qiniu_Put($upToken, $key1, "Qiniu Storage!", null);
echo "====> Qiniu_Put result: \n";
if ($err !== null) {
var_mp($err);
} else {
var_mp($ret);
}
上傳本地文件
require_once("qiniu/io.php");
require_once("qiniu/rs.php");
$bucket = "phpsdk";
$key1 = "file_name1";
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
$upToken = $putPolicy->Token(null);
$putExtra = new Qiniu_PutExtra();
$putExtra->Crc32 = 1;
list($ret, $err) = Qiniu_PutFile($upToken, $key1, __file__, $putExtra);
echo "====> Qiniu_PutFile result: \n";
if ($err !== null) {
var_mp($err);
} else {
var_mp($ret);
}
1.2 上傳策略
uptoken 實際上是用 AccessKey/SecretKey 進行數字簽名的上傳策略(Qiniu_RS_PutPolicy),它控制則整個上傳流程的行為。讓我們快速過一遍你都能夠決策啥:
class Qiniu_RS_PutPolicy
{
public $Scope; // 必選項。可以是 bucketName 或者 bucketName:key
public $CallbackUrl; // 可選
public $CallbackBody; // 可選
public $ReturnUrl; // 可選, 更貼切的名字是 redirectUrl。
public $ReturnBody; // 可選
public $AsyncOps; // 可選
public $EndUser; // 可選
public $Expires; // 可選。默認是 3600 秒
}
scope 限定客戶端的許可權。如果 scope 是 bucket,則客戶端只能新增文件到指定的 bucket,不能修改文件。如果 scope 為 bucket:key,則客戶端可以修改指定的文件。
callbackUrl 設定業務伺服器的回調地址,這樣業務伺服器才能感知到上傳行為的發生。
callbackBody 設定業務伺服器的回調信息。文件上傳成功後,七牛向業務伺服器的callbackUrl發送的POST請求攜帶的數據。支持 魔法變數 和 自定義變數。
returnUrl 設置用於瀏覽器端文件上傳成功後,瀏覽器執行301跳轉的URL,一般為 HTML Form 上傳時使用。文件上傳成功後瀏覽器會自動跳轉到 returnUrl?upload_ret=returnBody。
returnBody 可調整返回給客戶端的數據包,支持 魔法變數 和 自定義變數。returnBody 只在沒有 callbackUrl 時有效(否則直接返回 callbackUrl 返回的結果)。不同情形下默認返回的 returnBody 並不相同。在一般情況下返回的是文件內容的 hash,也就是下載該文件時的 etag;但指定 returnUrl 時默認的 returnBody 會帶上更多的信息。
asyncOps 可指定上傳完成後,需要自動執行哪些數據處理。這是因為有些數據處理操作(比如音視頻轉碼)比較慢,如果不進行預轉可能第一次訪問的時候效果不理想,預轉可以很大程度改善這一點。
關於上傳策略更完整的說明,請參考 uptoken。
2. 文件下載
七牛雲存儲上的資源下載分為 公有資源下載 和 私有資源下載 。
私有(private)是 Bucket(空間)的一個屬性,一個私有 Bucket 中的資源為私有資源,私有資源不可匿名下載。
新創建的空間(Bucket)預設為私有,也可以將某個 Bucket 設為公有,公有 Bucket 中的資源為公有資源,公有資源可以匿名下載。
2.1 公有資源下載
如果在給bucket綁定了域名的話,可以通過以下地址訪問。
[GET] http://<domain>/<key>
示例代碼:
$key = 'pic.jpg';
$domain = 'phpsdk.qiniudn.com';
//$baseUrl 就是您要訪問資源的地址
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
其中可以到七牛雲存儲開發者自助網站綁定, 域名可以使用自己一級域名的或者是由七牛提供的二級域名(<bucket>.qiniudn.com)。注意,尖括弧不是必需,代表替換項。
2.2 私有資源下載
私有資源必須通過臨時下載授權憑證(downloadToken)下載,如下:
[GET] http://<domain>/<key>?e=<deadline>&token=<downloadToken>
注意,尖括弧不是必需,代表替換項。
私有下載鏈接可以使用 SDK 提供的如下方法生成:
require_once("qiniu/rs.php");
$key = 'pic.jpg';
$domain = 'phpsdk.qiniudn.com';
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
$getPolicy = new Qiniu_RS_GetPolicy();
$privateUrl = $getPolicy->MakeRequest($baseUrl, null);
echo "====> getPolicy result: \n";
echo $privateUrl . "\n";
數據處理介面
七牛支持在雲端對圖像, 視頻, 音頻等富媒體進行個性化處理
1. 圖像
1.1 查看圖像屬性
require_once("qiniu/rs.php");
require_once("qiniu/fop.php");
$key = 'pic.jpg';
$domain = 'phpsdk.qiniudn.com';
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
//生成baseUrl
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
//生成fopUrl
$imgInfo = new Qiniu_ImageInfo;
$imgInfoUrl = $imgInfo->MakeRequest($baseUrl);
//對fopUrl 進行簽名,生成privateUrl。 公有bucket 此步可以省去。
$getPolicy = new Qiniu_RS_GetPolicy();
$imgInfoPrivateUrl = $getPolicy->MakeRequest($imgInfoUrl, null);
echo "====> imageInfo privateUrl: \n";
echo $imgInfoPrivateUrl . "\n";
將$imgInfoPrivateUrl粘貼到瀏覽器地址欄中就可以查看該圖像的信息了。
1.2 查看圖片EXIF信息
require_once("qiniu/rs.php");
require_once("qiniu/fop.php");
$key = 'pic.jpg';
$domain = 'phpsdk.qiniudn.com';
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
//生成baseUrl
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
//生成fopUrl
$imgExif = new Qiniu_Exif;
$imgExifUrl = $imgExif->MakeRequest($baseUrl);
//對fopUrl 進行簽名,生成privateUrl。 公有bucket 此步可以省去。
$getPolicy = new Qiniu_RS_GetPolicy();
$imgExifPrivateUrl = $getPolicy->MakeRequest($imgExifUrl, null);
echo "====> imageView privateUrl: \n";
echo $imgExifPrivateUrl . "\n";
1.3 生成圖片預覽
require_once("qiniu/rs.php");
require_once("qiniu/fop.php");
$key = 'pic.jpg';
$domain = 'phpsdk.qiniudn.com';
$accessKey = '<YOUR_APP_ACCESS_KEY>';
$secretKey = '<YOUR_APP_SECRET_KEY>';
Qiniu_SetKeys($accessKey, $secretKey);
//生成baseUrl
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
//生成fopUrl
$imgView = new Qiniu_ImageView;
$imgView->Mode = 1;
$imgView->Width = 60;
$imgView->Height = 120;
$imgViewUrl = $imgView->MakeRequest($baseUrl);
//對fopUrl 進行簽名,生成privateUrl。 公有bucket 此步可以省去。
$getPolicy = new Qiniu_RS_GetPolicy();
$imgViewPrivateUrl = $getPolicy->MakeRequest($imgViewUrl, null);
echo "====> imageView privateUrl: \n";
echo $imgViewPrivateUrl . "\n";
貢獻代碼
Fork
創建您的特性分支 (git checkout -b my-new-feature)
提交您的改動 (git commit -am 'Added some feature')
將您的修改記錄提交到遠程 git 倉庫 (git push origin my-new-feature)
然後到 github 網站的該 git 遠程倉庫的 my-new-feature 分支下發起 Pull Request

Ⅱ 微信裡面有個鏈接點進來就是這。我可以製作這種嘛。。就是我也想做個這樣的需要什麼東西。最好有步驟

1.下面的步奏之前去七牛雲存儲注冊一個賬號,把你的APP,以及LOGO或者軟體的圖標上傳上去,你就能拿到你的軟體下載以及圖標等鏈接了2.在電腦上用360瀏覽器打開你說的那個頁面3.在頁面的空白處點滑鼠右鍵選擇查看源代碼4.把代碼保存到txt記事本里5.代碼你不要管,找到文字部分(如「1.隨時隨地搜索企業與產品」)將它修改為你要寫的信息6.在底部有倆個aherf開頭的代碼,裡面各有一個鏈接,將這個鏈接替換為你的軟體下載鏈接(就是之前七牛上傳後給你的那個)7.改好之後將這個txt文件保存為「某某某.html」格式文件上傳到七牛,拿到鏈接,在瀏覽器打開就是你的頁面了

Ⅲ 自己搭建一個源碼演示站,需要多大的伺服器!急求!!!

如果是演示站那麼1核2g應該夠用的了。低於這個配置就不流暢了。老魏為此寫過雲伺服器手動建站等多篇教程,看完有疑問可以問,在線了就回答。

Ⅳ 關於七牛雲存儲自定義URL的問題

近段時間將使用七牛雲存儲來存放用戶上傳的數據,客戶端通過七牛的js-sdk與七牛交互,服務端C#實現了七牛相關的介面。在這過程中多多少少遇到點問題,在這里總結一下。原文: 使用七牛雲存儲的一些經驗總結
599錯誤處理
如果在與七牛的交互中出現http狀態碼為599的錯誤,一句話,不要猶豫,直接聯系七牛技術支持 。七牛的文檔也在很多地方提到這個錯誤,都是指導大家去聯系技術支持的。筆者是在分塊上傳後的 mkfile 調用時出現的,聯系技術支持後,說是調整了一下,讓我重試。後來就好了...
分塊上傳無法從回調中獲得文件的原始名
簡單上傳採用的是multipart/form-data方式上傳,七牛服務端能夠從請求中獲得文件的原始名,並支持使用魔法變數 $(fname) 回調業務伺服器。不過當使用分片上傳的時候情況有所不同。分片上傳需要在最後調用 mkfile ,來將分片拼接起來。但是, mkfile 介面支持普通的請求,並沒有附帶文件名,所以七牛也就無法獲得文件名,此時從 $(fname) 中是取不到文件名的。這個問題我也向七牛技術支持提交了問題,得到的結果是使用自定義變數 mkfile 支持將自定義變數放在url中,回調的時候自定義變數可以傳遞給業務伺服器。
慎用圖片預處理
七牛雲支持很多對文件的預處理,其中最常用的應該就是圖片預處理了,可以對圖片的大小做變換等。七牛推薦使用GET的方式直接指定圖片處理結果的url,像這樣:
http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView2/1/w/200/h/200

處理後的圖片會自動緩存,用戶不用關心,只要每次訪問都用這個url就行了。然而,筆者在開始的時候,為了保持與其他文件形式統一的處理方法,對圖片使用了預處理(因為視頻什麼的只能預處理),即在token中指定了預處理。此時問題出現了,從後台的日誌看到,圖片的預處理通知回調竟然比正常的上傳成功回調還要快!這就導致預處理結果到來之前,我的業務伺服器的資料庫中還沒有這個圖片,無法保存預處理結果了。所以 推薦還是使用url直接處理,對圖片要慎用預處理
視頻文件無法快進播放
通常用戶在觀看視頻的時候都會根據自己的喜好,快速將視頻定位到指定的時間播放。實現這個功能,需要視頻本身有關鍵幀信息、服務端需要支持關鍵幀播放請求,在 這篇文章 中有詳細討論。
但是筆者發現,在使用七牛雲轉化後的視頻,這樣做是無效的。於是咨詢技術支持,得到的答案是:轉化的文件是具有關鍵幀的,但七牛使用CDN加速,所以關鍵幀請求需要CDN的支持,如果想要用這個功能的話,需要單獨聯系銷售或技術支持在CDN上配置,而且時間比較長。筆者聯系了銷售和技術支持,說是幫我配置,但到現在還沒有搞定,因為最近這個也不是特別重要,所以也沒有跟下去。
Callback校驗
這是可選的一個步驟。由於七牛雲會在上傳完成之後回調業務伺服器,所以理論上說業務伺服器需要校驗這個回調的合理性。原理在七牛的 文檔 中有,需要用到 HMAC-SHA1 簽名函數。但是七牛的sdk中沒有提供直接的方式來做校驗,在研讀文檔、多次失敗和查看sdk源碼後,筆者終於校驗成功了。關鍵的分歧在於,文檔中的這句話:

獲取明文:data = Request.URL.Path +」\n」 +Request.Body

這里的 Request.URL.Path 是否包含Querystring?答案是包含的!下面是筆者C#服務端的校驗代碼,使用的是ASP.NET Web Api:
```C#
byte[] key = System.Text.Encoding.UTF8.GetBytes(Qiniu.Conf.Config.SECRET_KEY);
using (HMACSHA1 hmac = new HMACSHA1(key))
{
var t = filterContext.Request.Content.ReadAsStringAsync();
t.Wait();
string rawbody = t.Result;
log.DebugFormat("request's rawbody : {0}", rawbody);
string text = filterContext.Request.RequestUri.PathAndQuery + "\n" + rawbody;
log.DebugFormat("PathAndQuery + \n + rawbody : {0}", text);
byte[] digest = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(text));
string computed = Qiniu.Util.Base64URLSafe.Encode(digest);
log.DebugFormat("Computed hash after base64 : {0}", computed);
IEnumerable<string> auths;
if (filterContext.Request.Headers.TryGetValues("Authorization", out auths) && auths.Count() == 1)
{
string auth = auths.First();
log.DebugFormat("Authorization in header : {0}", auth);
if (auth.StartsWith("QBox "))
{
var arr = auth.Substring(5).Split(':');
if (arr.Length == 2)
{
if (arr[1] != computed)
{
log.ErrorFormat("Authorization failed. Since auth from header {0} not equals computed {1}", arr[1], computed);
}
else
{
log.Debug("Authorization success.");
//only pass can be return
return;
}
}
else
{
log.Error("Callback Authorization's format is invalid, can not find two part after split by ':'.");
}
}
else
{
log.Error("Callback Authorization's format is invalid, missing leading 'QBox '.");
}
}
else
{
log.Error("The request from qiniu callback is missing 'Authorization'");
}

filterContext.Response = filterContext.Request.CreateResponse(System.Net.HttpStatusCode.Forbidden);

}

如下幾個注意點:

- 明文應當是請求的path+querystring部分和rawbody
- 對於.NET而言,明文和key都需要用UTF-8編碼變換成位元組才能進行簽名。而php中的hash_hmac函數完全不用這么復雜...
- 簽名的結果再用base64的url安全的方式編碼,再與請求的http頭部的Authorization比較

建議官方在文檔中加入一些相對底層一些的編程語言的實現,php太高端了...

## js-sdk實現略顯粗糙 ##

在使用過程中,我發現[官方的js-sdk](https://github.com/qiniupd/qiniu-js-sdk/)有幾個我覺得不好的地方:

**不能為每個文件獲取UpToken**

試想,在文件上傳過程中有獲取UpToken是必須的,而且UpToken又需要包含預處理指令,不同的文件顯然需要不同的UpToken,而在js-sdk的實現中,只在初始化這個上傳組件對象的時候請求一次上傳憑證,後面所有的上傳都需要使用這個預先得到的UpToken:

```javascript
uploader.bind('Init', function(up, params) {
getUpToken();
});

於是我修改了這部分,在 BeforeUpload 事件中請求UpToken。建議官方考慮更改這個地方
只能實現分片上傳,無法斷點續傳
js-sdk的實現在分片上傳的實現上,是很簡單的,不僅沒有使用分片,而是分塊(一塊4m,調用mkblk),而且沒有實現持久化ctx,或者類似的回調或介面。4m分塊這個問題還可以不追究,沒有實現持久化ctx就說不過去了,不持久化怎麼實現斷點續傳撒?!就算不實現,也應該給出回調的入口,讓調用者來實現持久化,而我實在無法找到這個'空子'可鑽,只能直接在源碼上改動了。
沒有復用流行類庫的東西
這個其實算不上問題,因為作為一個不依賴jquery的sdk,當然不能使用jquery現成的東西,比如ajax。不依賴jquery就算了,依賴plupload是幾個意思嘛,還依賴全局對象...於是最後,我乾脆自己將sdk改成了Backbone的類,將不要的東西統統去掉,使用jquery和underscore簡化代碼了...

Ⅳ 有人關注 avalon 這個 MVVM 框架嗎

Client-side 的 MVVM 建議還是用社區成熟的,除非你有能力也願意去貢獻。

針對第三個鏈接的回復:

首先,看到「司徒正美」就呵呵了……

他說的 AngularJS 問題我只認同一點:「空間換時間」,AngularJS 團隊也是建議「在 DOM nodes 小於 2000 的項目上用」,以達到最佳的開發效率和性能的平衡。

而其他,並沒有他說得那麼嚴重,一個 injection 也就是這樣:

angnular.controll('MainCtrl', [ '$scope', '$q', '$timeout', '$window', function ( $scope, $q, $timeout, $window ) {} ])

上述代碼這是抗壓縮的。

AngularJS 為了達成 <input ng-model='username'> <h1
ng-bind='user'></h1> 的自動更新和 $scope.$watch('username', function
(username) { if (!username) { $scope.username = 'Tell me your name' } })
的數據監控,自然不可避免地阻止「實時」 DOM 更新,否則性能會有隱患。

這一切,都是一種選擇的問題。

AngularJS 的上手是很快的,完全感覺不到司徒正美說的「上手難度非常高」(好吧,為了 single-page app
確實耗費了不少時間在 nested views 上,直到我遇到 ui-router,這也側面證明了 AngularJS 的社區力量)—— @sofish 和我看了一下文檔就知道怎麼寫,他當天問我一些問題之後,幾天內就發布了 AngularJS 版的 staticfile.org。難嗎?用 AngularJS 甚至可以不改原有架構(見 http://joome.net/lab/partners 源碼,不是一個好例子,這場景該用 doT)。

最後,對司徒正美的個人看法:我也訂閱過他的博客很長時間,很清楚他的技術積淀有多深厚,同時也察覺到他對性能的異樣追求,所以在他 AvalonJS 入門文章出來之後,果斷取消了訂閱。

正如七牛雲儲存許式偉說的「大部分 C++ 程序員熱衷於性能偏執,甚至是異常的偏執」( http://open.qiniudn.com/golang-and-cloud-storage.pdf ),我也在司徒正美身上看到了這個偏執。

我們這個時代其實是不錯的時代,因為:

- I/O 瓶頸?上 SSD。
- CPU 瓶頸?上集群。
- Client-side 速度慢?V8 引發了引擎競賽的大潮,Blink 也很有可能引發 DOM 性能競賽的潮流。

過度關注性能,有意義嗎?我知道這沒有正確答案,但從 Rails 和 AngularJS 的火,多少可以窺見大眾和市場的選擇。

Ⅵ 短視頻系統開發用什麼語言開發的

您好,根據我們的開發經驗,短視頻系統開發會用到以下幾種語言
1、 IOS端開發語言:objective-c
2、安卓端開發語言:java
3、 後台開發語言:PHP,框架用π框架加ThinkPHP。

這是比較常見的短視頻系統開發語言,這些開發語言都是原生的,因此使用感為最佳。
如果有相關問題可以繼續追問我,直接評論或私信即可

Ⅶ 開發直播APP有哪些難點

視頻直播軟體開發發展勢頭非常之猛,企業要想分一杯羹還得加把勁才行。目前攔在企業開發面前的是技術難題、直播模式還停留在電腦時代和盈利方式簡單等。
難點分析:
技術難題:支持幾個人同時直播和讓上百萬人一起直播是兩回事。要想做一個上規模的直播平台,不僅需要比較強的寬頻吞吐能力,而且在一定范圍內用戶數據的波動也是要求比較高的。畫面還原、不出現卡屏等也都是企業在開發視頻直播平台時需要解決的問題。
直播模式還停留在電腦時代:2016是手機視頻直播的元年,由於電腦端經驗的積累,其主要的直播方式還是和電腦端一樣。都是主播與用戶的互動,並沒有什麼新意,對於移動互聯網的新技術等運用得也是非常少,可以說整個行業還存在著一定的瓶頸。
盈利方式簡單:雖然直播的盈利方向是最為清晰的,廣告、打賞等。但是各大平台與網紅、明星等簽約的價格都不菲,單單只是靠廣告和打賞來盈利還是存在著一定的問題。
直播開發應做好以下:
一方面,有清晰的盈利方案,如通過廣告植入變賣流量,或者成立可持續發展的PGC會員增值體系,並藉此爭取融資繼續不斷擴大市場份額以站穩腳跟。
另一方面,直播app開發不斷調整產品功能,積極利用VR和AR技術並投入到視頻直播平台。
最後的是,需要找可信的開發團隊,具有技術和開發經驗的啟匯網路。

Ⅷ 如何使用七牛python SDK寫一個同步腳本及使

七牛雲存儲的 Python 語言版本 SDK(本文以下稱 Python-SDK)是對七牛雲存儲API協議的一層封裝,以提供一套對於 Python 開發者而言簡單易用的開發工具。Python 開發者在對接 Python-SDK 時無需理解七牛雲存儲 API 協議的細節,原則上也不需要對 HTTP 協議和原理做非常深入的了解,但如果擁有基礎的 HTTP 知識,對於出錯場景的處理可以更加高效。

最近剛搭了個markdown靜態博客,想把圖片放到雲存儲中。

經過調研覺得七牛可以滿足我個人的需求,就選它了。

要引用圖片就要先將圖片上傳到雲上。

雖然七牛網站後台可以上傳文件,但每次上傳都需要先登錄,然後選擇圖片,設置連接地址,才能上傳。

這個過程有些繁瑣,所以我便想用七牛雲提供的SDK寫個一同步工具,方便增量同步文件。

有了這個想法,就馬上行動。花了大概一個上午的時間,總算把這個工具給寫出來,並放到GitOSC和github上。

?

#!/usr/bin/env python#-*- coding:utf-8 -*-## AUTHOR = "heqingpan"# AUTHOR_EMAIL = "[email protected]"# URL = "http://git.oschina.net/hqp/qiniu_sync"import qiniufrom qiniu import Authfrom qiniu import BucketManagerimport osimport reaccess_key = ''secret_key = ''bucket_name = ''bucket_domain = ''q = Auth(access_key, secret_key)bucket = BucketManager(q)basedir=os.path.realpath(os.path.dirname(__file__))filename=__file__ignore_paths=[filename,"{0}c".format(filename)]ignore_names=[".DS_Store",".git",".gitignore"]charset="utf8"diff_time=2*60def list_all(bucket_name, bucket=None, prefix="", limit=100):rlist=[]if bucket is None:bucket = BucketManager(q)marker = Noneeof = Falsewhile eof is False:ret, eof, info = bucket.list(bucket_name, prefix=prefix, marker=marker, limit=limit)marker = ret.get('marker', None)for item in ret['items']:rlist.append(item["key"])if eof is not True:# 錯誤處理#print "error"passreturn rlistdef get_files(basedir="",fix="",rlist=None,ignore_paths=[],ignore_names=[]):if rlist is None:rlist=[]for subfile in os.listdir(basedir):temp_path=os.path.join(basedir,subfile)tp=os.path.join(fix,subfile)if tp in ignore_names:continueif tp in ignore_paths:continueif os.path.isfile(temp_path):rlist.append(tp)elif os.path.isdir(temp_path):get_files(temp_path,tp,rlist,ignore_paths,ignore_names)return rlistdef get_valid_key_files(subdir=""):basedir=subdir or basedirfiles = get_files(basedir=basedir,ignore_paths=ignore_paths,ignore_names=ignore_names)return map(lambda f:(f.replace("\","/"),f),files)def sync():qn_keys=list_all(bucket_name,bucket)qn_set=set(qn_keys)l_key_files=get_valid_key_files(basedir)k2f={}update_keys=[]u_count=500u_index=0for k,f in l_key_files:k2f[k]=fstr_k=kif isinstance(k,str):k=k.decode(charset)if k in qn_set:update_keys.append(str_k)u_index+=1if u_index > u_count:u_index-=u_countupdate_file(k2f,update_keys)update_keys=[]else:# uploapload_file(k,os.path.join(basedir,f))if update_keys:update_file(k2f,update_keys)print "sync end"def update_file(k2f,ulist):ops=qiniu.build_batch_stat(bucket_name,ulist)rets,infos = bucket.batch(ops)for i in xrange(len(ulist)):k=ulist[i]f=k2f.get(k)ret=rets[i]["data"]size=ret.get("fsize",None)put_time = int(ret.get("putTime")/10000000)local_size=os.path.getsize(f)local_time=int(os.path.getatime(f))if local_size==size:continueif put_time >= local_time - diff_time:# is newcontinue# updateupload_file(k,os.path.join(basedir,f))def upload_file(key,localfile):print "upload_file:"print keytoken = q.upload_token(bucket_name, key)mime_type = get_mime_type(localfile)params = {'x:a': 'a'}progress_handler = lambda progress, total: progressret, info = qiniu.put_file(token, key, localfile, params, mime_type, progress_handler=progress_handler)def get_mime_type(path):mime_type = "text/plain"return mime_typedef main():sync()if __name__=="__main__":main()

這個同步腳本支持批量比較文件,差異增量更新、批量更新。

使用方式

安裝七牛Python SDK

?

1pip install qiniu

填寫腳本文件(qiniusync.py)的配置信息

?

123access_key = ''secret_key = ''bucket_name = ''

注冊後可以拿到對應的信息

將腳本文件(qiniusync.py)拷貝到待同步根目錄

運行腳本

?

1python qiniusync.py

後記

寫完提交之後才發現,七牛已經提供相應的工具,我這個算是重復造輪子吧。

既然已經寫,就發出來,當做熟悉一下七牛的SDK也不錯,說不定以後還能用的上。

七牛雲存儲Python SDK使用教程

本教程旨在介紹如何使用七牛的Python SDK來快速地進行文件上傳,下載,處理,管理等工作。

安裝

首先,要使用Python的SDK必須要先安裝。七牛的Python SDK是開源的,託管在Github上面,項目地址為https://github.com/qiniu/python-sdk。

安裝的方式可以如項目的說明上所說,用 pip install qiniu 。當然也可以直接 clone 一份源代碼下來直接使用。我一般喜歡直接 clone 源代碼,這樣的話,如果要對SDK做一些改動也是十分容易的。

最新版本的Python SDK需要依賴 requests 庫,所以要提前安裝好。安裝方式當然也可以用 pip install requests 。

開發環境

Python的開發環境有很多種選擇,如果喜歡文本的方式,比如vim,emacs,sublime text等都是很好的選擇,如果你喜歡IDE,那麼最流行的莫過於 PyCharm 了。 PyCharm 的最新版本到這里下載。

Access Key和Secret Key

我們知道七牛雲存儲的許可權校驗機制基於一對密鑰,分別稱為 Access Key 和 Secret Key 。其中 Access Key 是公鑰, Secret Key 是私鑰。這一對密鑰可以從七牛的後台獲取。

小試牛刀

好了,做了上面的這些准備工作,我們就去上傳一個簡單的文件,練練手。

?

1234python#coding=utf-8__author__ = 'jemy''''

本例演示了一個簡單的文件上傳。

這個例子裡面,sdk根據文件的大小選擇是Form方式上傳還是分片上傳。

?

'''import qiniuaccessKey = "<Your Access Key>"secretKey = "<Your Secret Key>"#解析結果def parseRet(retData, respInfo):if retData != None:print("Upload file success!")print("Hash: " + retData["hash"])print("Key: " + retData["key"])#檢查擴展參數for k, v in retData.items():if k[:2] == "x:":print(k + ":" + v)#檢查其他參數for k, v in retData.items():if k[:2] == "x:" or k == "hash" or k == "key":continueelse:print(k + ":" + str(v))else:print("Upload file failed!")print("Error: " + respInfo.text_body)#無key上傳,http請求中不指定key參數def upload_without_key(bucket, filePath):#生成上傳憑證auth = qiniu.Auth(accessKey, secretKey)upToken = auth.upload_token(bucket, key=None)#上傳文件retData, respInfo = qiniu.put_file(upToken, None, filePath)#解析結果parseRet(retData, respInfo)def main():bucket = "if-pbl"filePath = "/Users/jemy/Documents/jemy.png"upload_without_key(bucket, filePath)if __name__ == "__main__":main()

運行結果為:

Upload file success!
Hash: Fp0XR6tM4yZmeiKXw7eZzmeyYsq8
Key: Fp0XR6tM4yZmeiKXw7eZzmeyYsq8

從上面我們可以看到,使用七牛的Python SDK上傳文件的最基本的步驟是:

1.生成上傳憑證

2.上傳文件

3.解析回復結果

Ⅸ 做直播系統源碼的開發,需要注意哪些問題

開發直播系統源碼時需要注意的問題:
1、過度的設計
首選直播系統源碼注重設計是非常重要的,很多直播系統源碼正由於沒有設計,缺乏新意,而無法持續運行。但值得關注的是,直播系統搭建在設計過程中過度也會引發不良的反饋。過多和點綴和修飾也容易造成畫面的局促和不整潔感,所以在確定好直播系統風格後,盡量的簡約、主題明確,能覆蓋大部分用戶的審美即可。
2、整體設計缺乏連貫性
一個直播系統源碼往往由多個頁面組成,單個頁面的美觀,不代表能給用戶良好的體驗,外觀和功能的一致性非常重要,整體的連貫性,有規律的,有邏輯的操作,在用戶游覽時,才能給用戶一個整體的氛圍感受。畢竟用戶在使用直播系統時,不單單游覽一個頁面。
4、第三方平台的選擇
目前,直播比較成熟的第三方平台有:騰訊雲,阿里雲,網易雲信,七牛雲,金山雲等。就功能點而言,騰訊雲和阿里雲,較優,畢竟人家的實力在那放著呢。不過,其他的,也是百家爭鳴,各有長處,存在,即有道理。
相比其他,騰訊雲有一個最大的特點,就是支持「錄屏推流」,也就是可以錄播,將直播錄制下來,進行二次回放。而其他的第三方,都沒有此功能。
至於直播連麥、多主播互動、IOS 安卓 小程序的支持等等的,就根據實際的業務去選擇,即可。業務不同,需求不同,選擇就不同。

app怎麼製作自己的平台

1、我們要在網上找到製作APP的工具。這里我就給大家介紹快站這款工具了。個人認為比較好用,我們網頁搜索搜狐快站。點擊進入,我們要先注冊一個賬號。


閱讀全文

與七牛雲指南源碼相關的資料

熱點內容
git分支編譯 瀏覽:154
51單片機c語言應用程序設計實例精講 瀏覽:560
華為安卓手機編譯器 瀏覽:46
怎樣在打開微信前加密 瀏覽:664
旺旺聊天記錄怎麼加密 瀏覽:411
王安憶長恨歌pdf 瀏覽:619
mobile文件夾可以卸載嗎 瀏覽:280
什麼是2通道伺服器 瀏覽:346
mc正版怎麼開伺服器地址 瀏覽:408
樂高解壓朋友圈 瀏覽:14
linux軟raid性能 瀏覽:368
貼片機編程軟體下載 瀏覽:360
mooc大學樂學python答案 瀏覽:408
怎麼投訴途虎app 瀏覽:37
安卓重力感應怎麼關 瀏覽:720
我的世界ios怎麼建伺服器地址 瀏覽:759
伺服器埠ip都是什麼意思 瀏覽:263
華為主題軟體app怎麼下 瀏覽:840
我們的圖片能夠收藏加密嗎 瀏覽:979
mysql空值命令 瀏覽:213