當前位置:首頁 » 編程語言 » crc32php

crc32php

發布時間: 2025-10-01 15:59:07

① 請問:CRC是什麼意思

CRC意思是循環冗餘碼校驗。

校驗原理:(M-R)/G=Q+0/G

說明:以接收到的校驗碼除以約定的除數,若余數為0,則可認為接收到的數據是正確的。

例:有效信息1101,生成多項式樣1011

循環校驗碼解:

有效信息1101(k=4),即M(x)=x3+x2+x0,生成多項式1011(r+1=4,即r=3);

即G(x)=x3+x1+x0,M(x)·x3=x6+x5+x3,即1101000(對1101左移三位);

M(x)·x3/G(x)=1101000/1011=1111+001/1011即1010的CRC是:1101001。

(1)crc32php擴展閱讀:

CRC碼集選擇的原則:

若設碼字長度為N,信息欄位為K位,校驗欄位為R位(N=K+R),則對於CRC碼集中的任一碼字,存在且僅存在一個R次多項式g(x),使得

V(x)=A(x)g(x)=xRm(x)+r(x);

其中:m(x)為K次信息多項式,r(x)為R-1次校驗多項式,

g(x)稱為生成多項式:

g(x)=g0+g1x+g2x2+。。。+g(R-1)x(R-1)+gRxR

發送方通過指定的g(x)產生CRC碼字,接收方則通過該g(x)來驗證收到的CRC碼字。

② 關於CRC演算法,高手賜教

循環冗餘校驗(CRC)是一種根據網路數據封包或電腦檔案等數據產生少數固定位數的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。一般來說,循環冗餘校驗的值都是32位的整數。由於本函數易於用二進制的電腦硬體使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。它是由W. Wesley Peterson在他1961年發表的論文中披露[1]。

{{noteTA
|T=zh-hans:循環冗餘校驗;zh-hant:循環冗餘校驗;
|1=zh-hans:循環冗餘校驗;zh-hant:循環冗餘校驗;
}}
'''循環冗餘校驗'''(CRC)是一種根據網路數據封包或[[電腦檔案]]等數據產生少數固定位數的一種[[散列函數]],主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。一般來說,循環冗餘校驗的值都是32位的整數。由於本函數易於用二進制的[[電腦硬體]]使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。它是由[[W. Wesley Peterson]]在他1961年發表的論文中披露<ref name="PetersonBrown1961">
{{cite journal
| author = Peterson, W. W. and Brown, D. T.
| year = 1961
| month = January
| title = Cyclic Codes for Error Detection
| journal = Proceedings of the IRE
| doi = 10.1109/JRPROC.1961.287814
| issn = 0096-8390
| volume = 49
| pages = 228
}}</ref>。

==簡介==
CRC「校驗和」是兩個位元數據流採用二進制除法(沒有進位,使用XOR異或來代替減法)相除所得到的余數。其中被除數是需要計算校驗和的信息數據流的二進製表示;除數是一個長度為<math>n+1</math>的預定義(短)的二進制數,通常用多項式的系數來表示。在做除法之前,要在信息數據之後先加上<math>n</math>個0.

CRCa 是基於[[有限域]]GF(2)([[同餘|關於2同餘]])的[[多項式環]]。簡單的來說,就是所有系數都為0或1(又叫做二進制)的多項式系數的集合,並且集合對於所有的代數操作都是封閉的。例如:

:<math>(x^3 + x) + (x + 1) = x^3 + 2x + 1 \equiv x^3 + 1</math>

2會變成0,因為對系數的加法都會模2. 乘法也是類似的:

:<math>(x^2 + x)(x + 1) = x^3 + 2x^2 + x \equiv x^3 + x</math>

我們同樣可以對多項式作除法並且得到商和余數。例如, 如果我們用''x''<sup>3</sup> + ''x''<sup>2</sup> + ''x''除以''x'' + 1。我們會得到:
:<math>\frac{(x^3 + x^2 + x)}{(x+1)} = (x^2 + 1) - \frac{1}{(x+1)}</math>
<!--註:在說「除以」的時候, 讀者將會看到等式中的除號。這里看不到除號常使我感到有點混亂。-->

也就是說,

:<math>(x^3 + x^2 + x) = (x^2 + 1)(x + 1) - 1</math>

這里除法得到了商''x''<sup>2</sup> + 1和余數-1,因為是奇數所以最後一位是1。

字元串中的每一位其實就對應了這樣類型的多項式的系數。為了得到CRC, 我們首先將其乘以<math>x^{n}</math>,這里<math>n</math>是一個固定多項式的[[多項式的階|階]]數, 然後再將其除以這個固定的多項式,余數的系數就是CRC。

在上面的等式中,<math>x^2+x+1</math>表示了本來的信息位是<code>111</code>, <math>x+1</math>是所謂的'''鑰匙''', 而余數<math>1</math>(也就是<math>x^0</math>)就是CRC. key的最高次為1, 所以我們將原來的信息乘上<math>x^1</math>來得到<math>x^3 + x^2 + x</math>,也可視為原來的信息位補1個零成為<code>1110</code>。

一般來說,其形式為:

:<math>M(x) \cdot x^{n} = Q(x) \cdot K(x) + R (x) </math>

這里 M(x) 是原始的信息多項式。K(x)是<math>n</math>階的「鑰匙」多項式。<math>M(x) \cdot x^{n}</math>表示了將原始信息後面加上<math>n</math>個0。R(x)是余數多項式,既是CRC「校驗和」。在通訊中,發送者在原始的信息數據M後加上<math>n</math>位的R(替換本來附加的0)再發送。接收者收到M和R後,檢查<math>M(x) \cdot x^{n} - R(x)</math>是否能被<math>K(x)</math>整除。如果是,那麼接收者認為該信息是正確的。值得注意的是<math>M(x) \cdot x^{n} - R(x)</math>就是發送者所想要發送的數據。這個串又叫做''codeword''.

CRCs 經常被叫做「[[校驗和]]」, 但是這樣的說法嚴格來說並不是准確的,因為技術上來說,校驗「和」是通過加法來計算的,而不是CRC這里的除法。

「[[錯誤糾正編碼]]」常常和CRCs緊密相關,其語序糾正在傳輸過程中所產生的錯誤。這些編碼方式常常和數學原理緊密相關。

==實現==

==變體==
CRC 有幾種不同的變體

* <code>shiftRegister</code> 可以逆向使用,這樣就需要檢測最低位的值,每次向右移動一位。這就要求 <code>polynomial</code> 生成逆向的數據位結果。''實際上這是最常用的一個變體。''
* 可以先將數據最高位讀到移位寄存器,也可以先讀最低位。在通訊協議中,為了保留 CRC 的[[突發錯誤]]檢測特性,通常按照[[物理層]]發送數據位的方式計算 CRC。
* 為了檢查 CRC,需要在全部的碼字上進行 CRC 計算,而不是僅僅計算消息的 CRC 並把它與 CRC 比較。如果結果是 0,那麼就通過這項檢查。這是因為碼字 <math>M(x) \cdot x^{n} - R(x) = Q(x) \cdot K(x)</math> 可以被 <math>K(x)</math> 整除。
* 移位寄存器可以初始化成 1 而不是 0。同樣,在用演算法處理之前,消息的最初 <math>n</math> 個數據位要取反。這是因為未經修改的 CRC 無法區分只有起始 0 的個數不同的兩條消息。而經過這樣的取反過程,CRC 就可以正確地分辨這些消息了。
* CRC 在附加到消息數據流的時候可以進行取反。這樣,CRC 的檢查可以用直接的方法計算消息的 CRC、取反、然後與消息數據流中的 CRC 比較這個過程來完成,也可以通過計算全部的消息來完成。在後一種方法中,正確消息的結果不再是 0,而是 <math>\sum_{i=n}^{2n-1} x^{i}</math> 除以 <math>K(x)</math> 得到的結果。這個結果叫作核驗多項式 <math>C(x)</math>,它的十六進製表示也叫作[[幻數]]。

按照慣例,使用 CRC-32 多項式以及 CRC-16-CCITT 多項式時通常都要取反。CRC-32 的核驗多項式是
<math>C(x) = x^{31} + x^{30} + x^{26} + x^{25} + x^{24} + x^{18} + x^{15} + x^{14} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^4 + x^3 + x + 1</math>。

==錯誤檢測能力==
CRC 的錯誤檢測能力依賴於關鍵多項式的階次以及所使用的特定關鍵多項式。''誤碼多項式'' <math>E(x)</math> 是接收到的消息碼字與正確消息碼字的''異或''結果。當且僅當誤碼多項式能夠被 CRC 多項式整除的時候 CRC 演算法無法檢查到錯誤。
* 由於 CRC 的計算基於除法,任何多項式都無法檢測出一組全為零的數據出現的錯誤或者前面丟失的零。但是,可以根據 CRC 的[[#變體|變體]]來解決這個問題。
* 所有隻有一個數據位的錯誤都可以被至少有兩個非零系數的任意多項式檢測到。誤碼多項式是 <math>x^k</math>,並且 <math>x^k</math> 只能被 <math>i \le k</math> 的多項式 <math>x^i</math> 整除。
* CRC 可以檢測出所有間隔距離小於[[多項式階次]]的雙位錯誤,在這種情況下的誤碼多項式是
<math>E(x) = x^i + x^k = x^k \cdot (x^{i-k} + 1), \; i > k</math>。
如上所述,<math>x^k</math> 不能被 CRC 多項式整除,它得到一個 <math>x^{i-k} + 1</math> 項。根據定義,滿足多項式整除 <math>x^{i-k} + 1</math> 的 <math>{i-k}</math> 最小值就是多項是的階次。最高階次的多項式是[[本原多項式]],帶有二進制系數的 <math>n</math> 階多項式

==CRC 多項式規范==
下面的表格略去了「初始值」、「反射值」以及「最終異或值」。
* 對於一些復雜的校驗和來說這些十六進制數值是很重要的,如 CRC-32 以及 CRC-64。通常小於 CRC-16 的 CRC 不需要使用這些值。
* 通常可以通過改變這些值來得到各自不同的校驗和,但是校驗和演算法機制並沒有變化。

CRC 標准化問題
* 由於 CRC-12 有三種常用的形式,所以 CRC-12 的定義會有歧義
* 在應用的 CRC-8 的兩種形式都有數學上的缺陷。
* 據稱 CRC-16 與 CRC-32 至少有 10 種形式,但沒有一種在數學上是最優的。
* 同樣大小的 CCITT CRC 與 ITU CRC 不同,這個機構在不同時期定義了不同的校驗和。

==常用 CRC(按照 ITU-IEEE 規范)==
{|class="wikitable"
! 名稱|| 多項式 || 表示法:正常或者翻轉
|-
|CRC-1 || <math>x + 1</math><br>(用途:硬體,也稱為[[奇偶校驗位]]) || 0x1 or 0x1 (0x1)
|-
|CRC-5-CCITT || <math>x^{5} + x^{3} + x + 1</math> ([[ITU]] G.704 標准) || 0x15 (0x??)
|-
|CRC-5-USB || <math>x^{5} + x^{2} + 1</math> (用途:[[USB]] 信令包) || 0x05 or 0x14 (0x9)
|-
|CRC-7 || <math>x^{7} + x^{3} + 1</math> (用途:通信系統) || 0x09 or 0x48 (0x11)
|-
|CRC-8-ATM || <math>x^8 + x^2 + x + 1</math> (用途:ATM HEC) || 0x07 or 0xE0 (0xC1)
|-
|CRC-8-[[CCITT]] || <math>x^8 + x^7 + x^3 + x^2 + 1</math> (用途:[[1-Wire]] [[匯流排]]) ||
|-
|CRC-8-[[Dallas_Semiconctor|Dallas]]/[[Maxim_IC|Maxim]] || <math>x^8 + x^5 + x^4 + 1</math> (用途:[[1-Wire]] [[bus]]) || 0x31 or 0x8C
|-
|CRC-8 || <math>x^8 + x^7 + x^6 + x^4 + x^2 +1</math> || 0xEA(0x??)
|-
|CRC-10 || x<sup>10</sup> + x<sup>9</sup> + x<sup>5</sup> + x<sup>4</sup> + x + 1 || 0x233 (0x????)
|-
|CRC-12 || <math>x^{12} + x^{11} + x^3 + x^2 + x + 1</math><br>(用途:通信系統) || 0x80F or 0xF01 (0xE03)
|-
|CRC-16-Fletcher || 參見 [[Fletcher's checksum]] || 用於 [[Adler-32]] A & B CRC
|-
|CRC-16-CCITT || ''x''<sup>16</sup> + ''x''<sup>12</sup> + ''x''<sup>5</sup> + 1 ([[X25]], [[V.41]], [[Bluetooth]], [[PPP]], [[IrDA]]) || 0x1021 or 0x8408 (0x0811)
|-
|CRC-16-[[IBM]] || ''x''<sup>16</sup> +''x''<sup>15</sup> + ''x''<sup>2</sup> + 1 || 0x8005 or 0xA001 (0x4003)
|-
|CRC-16-[[BBS]] || x<sup>16</sup> + x<sup>15</sup> + x<sup>10</sup> + x<sup>3</sup> (用途:[[XMODEM]] 協議) || 0x8408 (0x????)
|-
|CRC-32-Adler || See [[Adler-32]] || 參見 [[Adler-32]]
|-
|CRC-32-MPEG2 || See [[IEEE 802.3]] || 參見 [[IEEE 802.3]]
|-
|CRC-32-[[IEEE 802.3]] || <math>x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1</math> || 0x04C11DB7 or 0xEDB88320 (0xDB710641)
|-
|CRC-32C (Castagnoli)<ref name="cast93"/>|| <math>x^{32} + x^{28} + x^{27} + x^{26} + x^{25} + x^{23} + x^{22} + x^{20} + x^{19} + x^{18} + x^{14} + x^{13} + x^{11} + x^{10} + x^9 + x^8 + x^6 + 1</math> || 0x1EDC6F41 or 0x82F63B78 (0x05EC76F1)
|-
|CRC-64-ISO || <math>x^{64} + x^4 + x^3 + x + 1</math><br>(use: ISO 3309) || 0x000000000000001B or 0xD800000000000000 (0xB000000000000001)
|-
|CRC-64-[[Ecma International|ECMA]]-182 || <math>x^{64} + x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} + x^{32} </math><br><!--Too long to display in one table--><math>+ x^{31} + x^{29} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^9 + x^7 + x^4 + x + 1</math><br>(as described in [http://www.ecma-international.org/publications/standards/Ecma-182.htm ECMA-182] p.63) || 0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
|-
|CRC-128 || IEEE-ITU 標准。被 [[MD5]] & [[SHA-1]] 取代||
|-
|CRC-160 || IEEE-ITU 標准。被 [[MD5]] & [[SHA-1]] 取代||
|-
|}

==CRC 與數據完整性==
盡管在[[錯誤檢測]]中非常有用,CRC 並不能可靠地驗證[[數據完整性]](即數據沒有發生任何變化),這是因為 CRC 多項式是線性結構,可以非常容易地''故意''改變數據而維持 CRC 不變,參見[http://www.woodmann.com/fravia/crctut1.htm CRC and how to Reverse it]中的證明。我們可以用 [[Message authentication code]] 驗證數據完整性。

===CRC發生碰撞的情況===

與所有其它的[[散列函數]]一樣,在一定次數的碰撞測試之後 CRC 也會接近 100% 出現碰撞。CRC 中每增加一個數據位,就會將碰撞數目減少接近 50%,如 CRC-20 與 CRC-21 相比。
* 理論上來講,CRC64 的碰撞概率大約是每 18{{e|18}} 個 CRC 碼出現一次。
* 由於 CRC 的不分解多項式特性,所以經過合理設計的較少位數的 CRC 可能會與使用較多數據位但是設計很差的 CRC 的效率相媲美。在這種情況下 CRC-32 幾乎同 CRC-40 一樣優秀。

===設計 CRC 多項式===

生成多項式的選擇是 CRC 演算法實現中最重要的部分,所選擇的多項式必須有最大的錯誤檢測能力,同時保證總體的碰撞概率最小。多項式最重要的屬性是它的長度,也就是最高非零系數的數值,因為它直接影響著計算的校驗和的長度。

最常用的多項式長度有
* 9 位 (CRC-8)
* 17 位 (CRC-16)
* 33 位 (CRC-32)
* 65 位 (CRC-64)

在構建一個新的 CRC 多項式或者改進現有的 CRC 時,一個通用的數學原則是使用滿足所有模運算不可分解多項式約束條件的多項式。
* 這種情況下的不可分解是指多項式除了 1 與它自身之外不能被任何其它的多項式整除。

生成多項式的特性可以從演算法的定義中推導出來:
* 如果 CRC 有多於一個的非零系數,那麼 CRC 能夠檢查出輸入消息中的所有單數據位錯誤。
* CRC 可以用於檢測短於 2k 的輸入消息中的所有雙位錯誤,其中 k 是多項式的最長的不可分解部分的長度。
* 如果多項式可以被 x+1 整除,那麼不存在可以被它整除的有奇數個非零系數的多項式。因此,它可以用來檢測輸入消息中的奇數個錯誤,就象奇偶校驗函數那樣。

==參見==
總的分類
* [[糾錯碼]]
* [[校驗和演算法列表]]
* [[奇偶校驗位]]

特殊技術參考
* [[Adler-32]]
* [[Fletcher's checksum]]

==參考文獻 ==
<references/>

==外部鏈接==
* [http://www.relisoft.com/science/CrcMath.html Tutorial and C++ implementation] of CRC
* Cyclic rendancy check - a simple guide to what it means for your data, CD and DVD discs. http://www.softwarepatch.com/tips/cyclic-rendancy.html
* [http://www.ross.net/crc/ ''The CRC Pitstop'']
* Williams, R. (1993-09) [http://www.repairfaq.org/filipg/LINK/F_crc_v3.html ''A Painless Guide to CRC Error Detection Algorithms'']
* [http://www.4d.com/docs/CMU/CMU79909.HTM ''Understanding Cyclic Rendancy Check'']
* Black, R. (1994-02) [http://www.cl.cam.ac.uk/Research/SRG/bluebook/21/crc/crc.html ''Fast CRC32 in Software''] — Algorithm 4 is used in Linux and info-zip's zip and unzip.
* Barr, M. ([http://www.netrino.com/Connecting/1999-11/ ''1999-11''], [http://www.netrino.com/Connecting/1999-12/ ''1999-12''], [http://www.netrino.com/Connecting/2000-01/ ''2000-01'']) checksums, CRCs, and their source code. Embedded Systems Programming
* [http://www.codeproject.com/cpp/crc32.asp CRC32: Generating a checksum for a file], C++ implementation by Brian Friesen
* Online [http://serversniff.net/hash.php Tool to compute common CRCs (8/16/32/64) from strings]
* Online [http://www.zorc.breitbandkatze.de/crc.html CRC calculator]
* Online [http://www.easics.com/webtools/crctool CRC Tool: Generator of synthesizable CRC functions]
* [http://www.paulschou.com/tools/xlate/ Online Char (ASCII), HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, CRC, etc. hashing algorithms]
* [http://apollo.backplane.com/matt/crc64.html CRC16 to CRC64 collision research]
* [http://sar.informatik.hu-berlin.de/research/publications/index.htm#SAR-PR-2006-05 Reversing CRC – Theory and Practice.]

{{math-stub}}

[[Category:校驗和演算法]]

[[bg:CRC]]
[[ca:Control de rendància cíclica]]
[[cs:Cyklický rendantní součet]]
[[de:Zyklische Rendanzprüfung]]
[[en:Cyclic rendancy check]]
[[es:Control de rendancia cíclica]]
[[eu:CRC]]
[[fi:CRC]]
[[fr:Contrôle de redondance cyclique]]
[[he:בדיקת יתירות מחזורית]]
[[id:CRC]]
[[it:Cyclic rendancy check]]
[[ja:巡迴冗長検査]]
[[ko:순환 중복 검사]]
[[nl:Cyclic Rendancy Check]]
[[pl:CRC]]
[[pt:CRC]]
[[ru:Циклический избыточный код]]
[[simple:Cyclic rendancy check]]
[[sk:Kontrola cyklickým kódom]]
[[sv:Cyclic Rendancy Check]]
[[vi:CRC]]

③ PHP gzip 壓縮後和 java deflate 數據不一致的問題

gzinflate 是解壓 gzdeflate 數據的啊,現在是想壓縮後和 java deflate 壓縮的數據一致。又看了下資料,java Deflater(int level,boolean nowrap) 壓縮,如果參數 'nowrap' 為 true,則不使用 ZLIB 頭和校驗和欄位,默認好像是 false。而採用 PHP gzencode ($data , -1, FORCE_DEFLATE ) 進行壓縮,只是帶了zlib headers 信息,沒有帶 crc32 checksum,可能問題就在這兒,但是還不知道怎麼解決,還請好心的版主給點建議!

④ Md5 和 CRC32 的區別

crc32 — 計算一個字元串的 crc32 多項式
生成 string 參數的 32 位循環冗餘校驗碼多項式……:
這句話從英文翻譯過來的,不正確,准確的說應該是這么理解:
以32位循環冗餘校驗多項式演算法,來計算一個字元串,返回一個(可能帶符號的)整數。

使用方法:
這個函數的功能類似於md5演算法、sha1演算法加密。這個函數的使用過程中,需要多考慮取返回的整數的絕對值就可以了。
至於如何能做到檢查傳輸的數據是否完整:
參考md5的常見使用場景。
32位循環冗餘校驗多項式:這個是一個數學演算法,在php的源碼內可以看到。你可以當作他是一個md5演算法的數字版。
MD5可靠性
首先是不可逆
其次,這個碼具有高度的離散性,也就是說,原信息的一點點變化就會導致MD5的巨大變化,
最後由於這個碼有128位那麼長,所以任意信息之間具有相同MD5碼的可能性非常之低,通常被認為是不可能的。
crc比較短,md5比較長
所以md5相對來說沖突的可能性要小很多
如果要求不高,是防範傳輸誤碼之類的用crc就可以了,crc效率要高很多
如果要防範人為惡意破壞,需要用md5,慢就慢點,圖個可靠性加強

⑤ 七牛雲存儲的音頻水印怎麼加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

熱點內容
phpa標簽 發布:2025-10-01 18:05:35 瀏覽:731
訪問簽證英國 發布:2025-10-01 17:55:32 瀏覽:1002
內存的存儲速度快 發布:2025-10-01 17:51:15 瀏覽:239
怎樣將終端管理軟體放至雲伺服器 發布:2025-10-01 17:50:30 瀏覽:733
linuxadobereader 發布:2025-10-01 17:49:52 瀏覽:67
1元北京伺服器雲空間 發布:2025-10-01 17:34:11 瀏覽:482
pythonscons 發布:2025-10-01 17:22:44 瀏覽:753
壓縮包11G 發布:2025-10-01 17:14:13 瀏覽:376
大腳舉報不了腳本 發布:2025-10-01 16:55:00 瀏覽:590
java1到100奇數和 發布:2025-10-01 16:43:11 瀏覽:51