天天看点

php断点续传之分割合并文件

<a href="http://s3.51cto.com/wyfs02/M02/12/28/wKioL1L7MQSTFjsnAAKa3CEUI5Q764.jpg" target="_blank"></a>

<code>&lt;?php</code>

<code>ini_set</code><code>(</code><code>"memory_limit"</code><code>, </code><code>"50M"</code><code>);</code><code>//必须的,根据你环境的实际情况尽量大,防止报错</code>

<code>ini_set</code><code>(</code><code>"max_execution_time"</code><code>, </code><code>"100"</code><code>);</code>

<code>//file_exists() 函数检查文件或目录是否存在,存在则返回 true,否则返回 false。</code>

<code>//fread() 函数读取文件(可安全用于二进制文件)。fread() 从文件指针 file 读取最多 length 个字节。</code>

<code>//filesize() 函数返回指定文件的大小(字节)。本函数的结果会被缓存。请使用 clearstatcache() 来清除缓存。</code>

<code>$orgFile</code> <code>= </code><code>'Fireworks8-chs.exe'</code><code>;</code><code>//源文件</code>

<code>$cacheFileName</code> <code>= </code><code>'vbcache'</code><code>;</code><code>//分割成的临时文件块</code>

<code>function</code> <code>cutFile(</code><code>$fileName</code><code>,</code><code>$block</code><code>) {</code><code>//分割</code>

<code>    </code><code>global</code> <code>$cacheFileName</code><code>;</code>

<code>    </code><code>if</code> <code>(!</code><code>file_exists</code><code>(</code><code>$fileName</code><code>)) </code><code>return</code> <code>false;</code>

<code>    </code><code>$num</code> <code>= 1;</code>

<code>    </code><code>$file</code> <code>= </code><code>fopen</code><code>(</code><code>$fileName</code><code>, </code><code>'rb'</code><code>);</code>

<code>    </code><code>while</code> <code>(</code><code>$content</code> <code>= </code><code>fread</code><code>(</code><code>$file</code><code>,</code><code>$block</code><code>)) {</code>

<code>        </code><code>$cacheFile</code> <code>= </code><code>$cacheFileName</code> <code>. </code><code>$num</code><code>++ . </code><code>'.dat'</code><code>;</code>

<code>        </code><code>$cfile</code> <code>= </code><code>fopen</code><code>(</code><code>$cacheFile</code><code>, </code><code>'wb'</code><code>);</code>

<code>        </code><code>fwrite(</code><code>$cfile</code><code>, </code><code>$content</code><code>);</code>

<code>        </code><code>fclose(</code><code>$cfile</code><code>);</code>

<code>    </code><code>}</code>

<code>    </code><code>fclose(</code><code>$file</code><code>);</code>

<code>}</code>

<code>function</code> <code>mergeFile(</code><code>$targetFile</code><code>) {</code><code>//合并</code>

<code>    </code><code>$file</code> <code>= </code><code>fopen</code><code>(</code><code>$targetFile</code><code>, </code><code>'wb'</code><code>);</code>

<code>    </code><code>while</code> <code>(</code><code>$num</code> <code>&gt; 0) {</code>

<code>        </code><code>if</code> <code>(</code><code>file_exists</code><code>(</code><code>$cacheFile</code><code>)) {</code>

<code>            </code><code>$cfile</code> <code>= </code><code>fopen</code><code>(</code><code>$cacheFile</code><code>, </code><code>'rb'</code><code>);</code>

<code>            </code><code>$content</code> <code>= </code><code>fread</code><code>(</code><code>$cfile</code><code>, </code><code>filesize</code><code>(</code><code>$cacheFile</code><code>));</code>

<code>            </code><code>fclose(</code><code>$cfile</code><code>);</code>

<code>            </code><code>fwrite(</code><code>$file</code><code>, </code><code>$content</code><code>);</code>

<code>        </code><code>}</code>

<code>        </code><code>else</code> <code>{</code>

<code>            </code><code>$num</code> <code>= -1;</code>

<code>//调用</code>

<code>cutFile(</code><code>$orgFile</code><code>, 10 * pow(2,20)); </code><code>//10 * pow(2,20) 就等于 10M    pow() 函数返回 x 的 y 次方</code>

<code>mergeFile(</code><code>'ok.exe'</code><code>);</code>

<code>?&gt;</code>

最近在研究php断点续传上传文件(要求不能使用swf插件),算是有点进展吧!

思路01:将文件分割成若干部分,后台一个一个接收合并,并记录下当前合并成功到了第几个。下此从这个开始合并,直到合并完成。判断:生成文件的大小和文件md5码是否一致。返回true or false。

思路02:文件流。通过记录指针写入文件。记录这次写到了第几针,下次从这里开始写。

继续研究中......

      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1358490,如需转载请自行联系原作者