拆分和组合文件

时间:2012-09-29 14:26:37

标签: php split fopen fseek

我有一个"开头"一个解决方案。 我写了这个函数(对不起间距):

<?php
set_time_limit(0);

// Just to get the remote filesize

function checkFilesize($url, $user = "", $pw = ""){

 ob_start();

 $ch = curl_init($url);

 curl_setopt($ch, CURLOPT_HEADER, 1);

 curl_setopt($ch, CURLOPT_NOBODY, 1);

 if(!empty($user) && !empty($pw)){

  $headers = array('Authorization: Basic ' .  base64_encode("$user:$pw"));

  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

 }

 $ok = curl_exec($ch);

 curl_close($ch);

 $head = ob_get_contents();

 ob_end_clean();

 $regex = '/Content-Length:\s([0-9].+?)\s/';

 $count = preg_match($regex, $head, $matches);

 return isset($matches[1]) ? $matches[1] : "unknown";

}

// Split filesize to threads

function fileCutter($filesize,$threads){

 $calc = round($filesize / count($threads));

 $count = 0;

 foreach($threads as $thread){

  $rounds[$count] =  $calc;

  $count++;

 }

 $count = 0;

 foreach($rounds as $round){

  $set = $count + 1;

  if($count == 0){

   $from = 0;

  } else {

   $from = ($round * $count);

  }

  $cal = ($round * $set);

  $final[$count] = array('from'=>$from,'to'=>$cal);

  $count++;

 }

 // Correct the "Rounded" result

 $end = end($final);

 $differance = $filesize - $end['to'];

 if (strpos($differance,'-') !== false) {} else {$add = '+';}

 $end_result =  ($end['to'].$add.$differance);

 $value=eval("return ($end_result);");

 $end_id = end(array_keys($final));

 $final[$end_id]['to'] = $value;

 // Return the complete array with the corrected result

 return $final;

}

$threads = array(
 0=>'test',
 1=>'test',
 2=>'test',
 3=>'test',
 4=>'test',
 5=>'test',
);

$file  = 'http://www.example.com/file.zip';

$filesize = checkFilesize($file);

$cuts = fileCutter($filesize,$threads);

print_r($cuts);

?>

(再次,抱歉。:))

它给出了#34;方向&#34;以特定字节拆分文件。 我尝试过这样的事情:

foreach($cuts as $cut){
$start = $cut['from'];
$finish = $cut['to'];
$f = fopen($file, "rb");
fseek($f, $start, SEEK_SET);
while(!(ftell($f) > $finish)){
  $data = fgetc($f);
}
fclose($f);

但它会无休止地循环。 问题是什么?或者,PHP中是否存在另一种拆分和组合文件的解决方案?

1 个答案:

答案 0 :(得分:3)

您可以使用带有相应参数$offset$maxlen的{​​{3}}来代替按字节方式读取文件:

//                             $incp  $ctx  $offset  $maxlen
$data = file_get_contents($fn, FALSE, NULL, $start, $finish-$start);

那将为你寻求和切割。