<a href="http://s3.51cto.com/wyfs02/M02/12/28/wKioL1L7MQSTFjsnAAKa3CEUI5Q764.jpg" target="_blank"></a>
<code><?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>> 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>?></code>
最近在研究php断点续传上传文件(要求不能使用swf插件),算是有点进展吧!
思路01:将文件分割成若干部分,后台一个一个接收合并,并记录下当前合并成功到了第几个。下此从这个开始合并,直到合并完成。判断:生成文件的大小和文件md5码是否一致。返回true or false。
思路02:文件流。通过记录指针写入文件。记录这次写到了第几针,下次从这里开始写。
继续研究中......
本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1358490,如需转载请自行联系原作者