crc32php
① 请问: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