天天看點

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,如需轉載請自行聯系原作者