摘要:原文使用七牛云存儲的一些經驗總結錯誤處理如果在與七牛的交互中出現(xiàn)狀態(tài)碼為的錯誤,一句話,不要猶豫,直接聯(lián)系七牛技術支持。但是筆者發(fā)現(xiàn),在使用七牛云轉化后的視頻,這樣做是無效的。
近段時間將使用七牛云存儲來存放用戶上傳的數(shù)據(jù),客戶端通過七牛的js-sdk與七牛交互,服務端C#實現(xiàn)了七牛相關的接口。在這過程中多多少少遇到點問題,在這里總結一下。原文:使用七牛云存儲的一些經驗總結
599錯誤處理如果在與七牛的交互中出現(xiàn)http狀態(tài)碼為599的錯誤,一句話,不要猶豫,直接聯(lián)系七牛技術支持。七牛的文檔也在很多地方提到這個錯誤,都是指導大家去聯(lián)系技術支持的。筆者是在分塊上傳后的mkfile調用時出現(xiàn)的,聯(lián)系技術支持后,說是調整了一下,讓我重試。后來就好了...
分塊上傳無法從回調中獲得文件的原始名簡單上傳采用的是multipart/form-data方式上傳,七牛服務端能夠從請求中獲得文件的原始名,并支持使用魔法變量$(fname)回調業(yè)務服務器。不過當使用分片上傳的時候情況有所不同。分片上傳需要在最后調用mkfile,來將分片拼接起來。但是,mkfile接口支持普通的請求,并沒有附帶文件名,所以七牛也就無法獲得文件名,此時從$(fname)中是取不到文件名的。這個問題我也向七牛技術支持提交了問題,得到的結果是使用自定義變量mkfile支持將自定義變量放在url中,回調的時候自定義變量可以傳遞給業(yè)務服務器。
慎用圖片預處理七牛云支持很多對文件的預處理,其中最常用的應該就是圖片預處理了,可以對圖片的大小做變換等。七牛推薦使用GET的方式直接指定圖片處理結果的url,像這樣:
http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView2/1/w/200/h/200
處理后的圖片會自動緩存,用戶不用關心,只要每次訪問都用這個url就行了。然而,筆者在開始的時候,為了保持與其他文件形式統(tǒng)一的處理方法,對圖片使用了預處理(因為視頻什么的只能預處理),即在token中指定了預處理。此時問題出現(xiàn)了,從后臺的日志看到,圖片的預處理通知回調竟然比正常的上傳成功回調還要快!這就導致預處理結果到來之前,我的業(yè)務服務器的數(shù)據(jù)庫中還沒有這個圖片,無法保存預處理結果了。所以推薦還是使用url直接處理,對圖片要慎用預處理
視頻文件無法快進播放通常用戶在觀看視頻的時候都會根據(jù)自己的喜好,快速將視頻定位到指定的時間播放。實現(xiàn)這個功能,需要視頻本身有關鍵幀信息、服務端需要支持關鍵幀播放請求,在這篇文章中有詳細討論。
但是筆者發(fā)現(xiàn),在使用七牛云轉化后的視頻,這樣做是無效的。于是咨詢技術支持,得到的答案是:轉化的文件是具有關鍵幀的,但七牛使用CDN加速,所以關鍵幀請求需要CDN的支持,如果想要用這個功能的話,需要多帶帶聯(lián)系銷售或技術支持在CDN上配置,而且時間比較長。筆者聯(lián)系了銷售和技術支持,說是幫我配置,但到現(xiàn)在還沒有搞定,因為最近這個也不是特別重要,所以也沒有跟下去。
這是可選的一個步驟。由于七牛云會在上傳完成之后回調業(yè)務服務器,所以理論上說業(yè)務服務器需要校驗這個回調的合理性。原理在七牛的文檔中有,需要用到HMAC-SHA1簽名函數(shù)。但是七牛的sdk中沒有提供直接的方式來做校驗,在研讀文檔、多次失敗和查看sdk源碼后,筆者終于校驗成功了。關鍵的分歧在于,文檔中的這句話:
獲取明文:data = Request.URL.Path +” ” +Request.Body
這里的Request.URL.Path是否包含Querystring?答案是包含的!下面是筆者C#服務端的校驗代碼,使用的是ASP.NET Web Api:
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 + " " + rawbody; log.DebugFormat("PathAndQuery + + 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); IEnumerableauths; 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編碼變換成字節(jié)才能進行簽名。而php中的hash_hmac函數(shù)完全不用這么復雜...
簽名的結果再用base64的url安全的方式編碼,再與請求的http頭部的Authorization比較
建議官方在文檔中加入一些相對底層一些的編程語言的實現(xiàn),php太高端了...
js-sdk實現(xiàn)略顯粗糙在使用過程中,我發(fā)現(xiàn)官方的js-sdk有幾個我覺得不好的地方:
不能為每個文件獲取UpToken
試想,在文件上傳過程中有獲取UpToken是必須的,而且UpToken又需要包含預處理指令,不同的文件顯然需要不同的UpToken,而在js-sdk的實現(xiàn)中,只在初始化這個上傳組件對象的時候請求一次上傳憑證,后面所有的上傳都需要使用這個預先得到的UpToken:
uploader.bind("Init", function(up, params) { getUpToken(); });
于是我修改了這部分,在BeforeUpload事件中請求UpToken。建議官方考慮更改這個地方
只能實現(xiàn)分片上傳,無法斷點續(xù)傳
js-sdk的實現(xiàn)在分片上傳的實現(xiàn)上,是很簡單的,不僅沒有使用分片,而是分塊(一塊4m,調用mkblk),而且沒有實現(xiàn)持久化ctx,或者類似的回調或接口。4m分塊這個問題還可以不追究,沒有實現(xiàn)持久化ctx就說不過去了,不持久化怎么實現(xiàn)斷點續(xù)傳撒?!就算不實現(xiàn),也應該給出回調的入口,讓調用者來實現(xiàn)持久化,而我實在無法找到這個"空子"可鉆,只能直接在源碼上改動了。
沒有復用流行類庫的東西
這個其實算不上問題,因為作為一個不依賴jquery的sdk,當然不能使用jquery現(xiàn)成的東西,比如ajax。不依賴jquery就算了,依賴plupload是幾個意思嘛,還依賴全局對象...于是最后,我干脆自己將sdk改成了Backbone的類,將不要的東西統(tǒng)統(tǒng)去掉,使用jquery和underscore簡化代碼了...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/87567.html
摘要:如果看完此文依然不解的還想使用七牛的,請站內信聯(lián)系明月,我可以收費全套代勞,費用不高配置快速當天見效效果明顯免費維護歡迎惠顧。 最近明月使用七牛加速自己博客初見成效后,也分享了不少七牛方面的經驗,很多站長也向明月咨詢了七牛方面的問題,本著分享的精神,明月今天就當一次義務的七牛推廣員給大家講解一番。showImg(https://segmentfault.com/img/bVMhUH?w...
摘要:如果看完此文依然不解的還想使用七牛的,請站內信聯(lián)系明月,我可以收費全套代勞,費用不高配置快速當天見效效果明顯免費維護歡迎惠顧。 最近明月使用七牛加速自己博客初見成效后,也分享了不少七牛方面的經驗,很多站長也向明月咨詢了七牛方面的問題,本著分享的精神,明月今天就當一次義務的七牛推廣員給大家講解一番。showImg(https://segmentfault.com/img/bVMhUH?w...
摘要:正文上傳圖片到七牛云這個需要前后端的配合才能實現(xiàn),這里是官方的參考鏈接。參考鏈接組件的怎么獲取進度值谷歌找到的其一谷歌找到的其二完 前言 最近在做后臺管理項目,采用的 vue-element-admin ,上傳圖片是一個很常用的功能,也遇到了很多問題,剛好趁此機會做一些總結。 初步總結下會提到的問題,目錄如下: el-upload 自定義上傳方法 圖片上傳到七牛云 圖片壓縮后再上傳(...
摘要:月日下午,七牛云美圖共享日在廈門舉行,來自七牛云美圖廈門大學羅普特等眾位大咖齊聚一堂。七牛云美圖共享日精華語錄計算機識別是按照具體問題具體分析,具體場景具體分析。又稱小牛匯共享日,是小牛匯舉辦的第一個系列活動。 時間機器、穿越星際的宇宙飛船、飛行汽車,幾乎每一部科幻電影作品中都能發(fā)明點新東西。超現(xiàn)實技術在引起人們陣陣贊嘆的同時,也在激勵著人們思考如何將不可能變成可能。而在我們的生活當中...
摘要:,在后續(xù)測試時遇到一個詭異,當文件過大時,任務腳本上傳到七牛云失敗。當我遇到大文件無法上傳到七牛云時,斷點調試到這里,發(fā)現(xiàn)返回的是。后來還真被我找到了,七牛云官方提供一個腳本工具。 業(yè)務場景 需求 我們項目有一個文件上傳需求,需要從客戶端上傳到七牛云的對象存儲和自己的應用服務器上。這里使用七牛云主要是實現(xiàn)下載分發(fā)。應用服務器需要留一份是因為后續(xù)需要做文件分析(并且是上傳后需要立馬分析出...
閱讀 2230·2021-11-24 10:26
閱讀 2826·2021-11-23 09:51
閱讀 2938·2021-10-08 10:05
閱讀 1732·2021-09-22 15:18
閱讀 1662·2019-08-29 18:45
閱讀 2175·2019-08-29 18:40
閱讀 3363·2019-08-29 16:16
閱讀 2921·2019-08-29 14:21