Używając PHP, próbuję wyświetlać duże pliki (maksymalnie 200 MB), które nie znajdują się w katalogu dostępnym w sieci z powodu problemów z autoryzacją. Obecnie używam wywołania readfile()
wraz z niektórymi nagłówkami do obsługi pliku, ale wydaje się, że PHP ładuje je do pamięci przed wysłaniem. Zamierzam wdrożyć na współdzielonym serwerze hostingowym, który nie pozwoli mi korzystać z dużej ilości pamięci ani dodawać własnych modułów Apache, takich jak X-Sendfile.Jak pobierać duże pliki za pomocą skryptu PHP
Nie mogę pozwolić, aby moje pliki znajdowały się w katalogu dostępnym w sieci ze względów bezpieczeństwa. Czy ktokolwiek zna metodę, która wymaga mniejszej ilości pamięci, którą mógłbym wdrożyć na współdzielonym serwerze hostingowym?
EDIT:
if(/* My authorization here */) {
$path = "/uploads/";
$name = $row[0]; //This is a MySQL reference with the filename
$fullname = $path . $name; //Create filename
$fd = fopen($fullname, "rb");
if ($fd) {
$fsize = filesize($fullname);
$path_parts = pathinfo($fullname);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
break;
case "zip":
header("Content-type: application/zip");
break;
default:
header("Content-type: application/octet-stream");
break;
}
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 1*(1024*1024));
echo $buffer;
ob_flush();
flush(); //These two flush commands seem to have helped with performance
}
}
else {
echo "Error opening file";
}
fclose($fd);
zgadzam jest to duplikat, ten facet próbuje pobrać za pośrednictwem PHP, gdzie, jak inne pytanie brzmi tylko jak pobrać dużego pliku .. różne kwestie uczciwie. –