readfile i ograniczenie przestrzeni

2015-02-13 13:08
0

Witam, chciałem napisać taki niewielki skrypt, który w contencie będzie wyrzucał jakiś plik z katalogu tak, aby można go było pobrać przez przeglądarkę, krótko mowiąc takie coś:

$ran=rand_string(5);
$Fw=Files('./streamy');
$OpenFile=$Fw[rand( 0, count($Fw) - 1 )];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$ran.' ');
readfile('./streamy/'.$OpenFile);

z mniejszymi plikami wszystko działa ok., ale przy większych (150MB+) wywala błąd:

Fatal error</b>:  Allowed memory size of 134217728 bytes exhausted

czy da się jakoś cały plik rozłożyć na części, aby go dobrze przesłać? tak żeby części nie przekraczały dostępnej pamięci? albo jak po prostu zrobić przekierowanie na ten plik, bez konieczności "wypisywania" go przez skrypt php?
dziękuje za pomoc.

dodanie znacznika <code class="none"> - @furious programming

edytowany 1x, ostatnio: furious programming, 2015-02-13 16:42
Treści błędów wstawiaj w znaczniki &lt;code=none&gt; - furious programming 2015-02-13 16:42

Pozostało 580 znaków

2015-02-13 13:48
0

Czym jest to Files, co to za funkcja?

Ogólnie wrzuć większy kawałek kodu (i wiekszy kawałek kodu błędu, z numerem linii i wskazaniem która to), z readfile nie powinno być problemu.


Pozostało 580 znaków

2015-02-13 14:22
0
<?php
function rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $str="";
    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ rand( 0, $size - 1 ) ];
    }

    return $str;
}

function IsFile( $str ) {
if (strlen($str)<=2){return 0;}
$dot=false;
$aufdot=false;
for($i=0;$i<strlen($str);$i++)
{
if($dot==true){$aufdot=true;return true;}
$char = $str{$i};
if($char=='.'){$dot=true;}
}
return $aufdot;
}

function Files($d)
{
$dir=$d;
$files1 = scandir($dir);
$array=array();
foreach ($files1 as &$value) {
if (IsFile($value)==true){
array_push($array,$value);
}}
return $array;
}

function Stream($f,$rh,$Hunks,$st)
{
while (ob_get_level()) {ob_end_clean();}
if (file_exists($f)) {
$size=filesize($f);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$rh.' ');
header('Content-Length: '.$size);
for($i=0;$i<$size;$i++)
{
if ($st>0){usleep($st);}
$Cur=$i*$Hunks;
$hunk=$Hunks;
if (($Cur+$hunk)>$size){$hunk=$size-$Cur;}
$section = file_get_contents($f, NULL, NULL, $Cur, $hunk);
echo $section;
}
}
return true;
}

$ran=rand_string(5);
$Fw=Files('./streamy');
if (count($Fw)<=0){exit(1);}
$OpenFile=$Fw[rand( 0, count($Fw) - 1 )];
$TrueFile='./streamy/'.$OpenFile;
Stream($TrueFile,$ran,4096,100);

//echo './streamy/'.$OpenFile;
?>  

cały ogólnie poprawiony skrypt, zamieniłem readline na file get_contents i dawkowanie powolne, ale kolejny problem to taki, że po pobraniu 50-100MB pobieranie zostaje przerwane, jakieś pomysły jak temu zaradzić?
A Files to poprostu funkcja zwracająca w tablicy nazwy wszystkich plików w katalogu.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0