Ich muss ein PHP-Skript schreiben, um potenziell große Dateien herunterladen. Die Datei, die ich hier berichte, funktioniert meistens gut. Wenn die Verbindung des Clients jedoch langsam ist, endet die Anforderung (mit dem Statuscode 200) in der Mitte des Herunterladens, aber nicht immer am selben Punkt und nicht zur selben Zeit. Ich habe versucht, einige php.ini-Variablen zu überschreiben (siehe die ersten Anweisungen), aber das Problem bleibt bestehen. Ich weiß nicht, ob es relevant ist, aber mein Hosting-Server ist SiteGround, und für einfache statische Dateianforderungen funktioniert der Download auch mit langsamen Verbindungen.Download große Datei mit PHP
Ich habe Forced downloading large file with php gefunden, aber ich habe die Antwort von Mario nicht verstanden. Ich bin neu in der Webprogrammierung.
Also hier ist mein Code.
<?php
ini_set('memory_limit','16M');
ini_set('post_max_size', '30M');
set_time_limit(0);
include ('../private/database_connection.php');
$downloadFolder = '../download/';
$fileName = $_POST['file'];
$filePath = $downloadFolder . $fileName;
if($fileName == NULL)
{
exit;
}
ob_start();
session_start();
if(!isset($_SESSION['Username']))
{
// or redirect to login (remembering this download request)
$_SESSION['previousPage'] = 'download.php?file=' . $fileName;
header("Location: login.php");
exit;
}
if (file_exists($filePath))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
//header('Content-Disposition: attachment; filename='.$fileName);
header("Content-Disposition: attachment; filename=\"$fileName\"");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
//header('Pragma: public');
header('Content-Length: ' . filesize($filePath));
ob_clean();
flush();
// download
// 1
// readfile($filePath);
// 2
$file = @fopen($filePath,"rb");
if ($file) {
while(!feof($file)) {
print(fread($file, 1024*8));
flush();
if (connection_status()!=0) {
@fclose($file);
die();
}
}
@fclose($file);
}
exit;
}
else
{
header('HTTP/1.1 404 File not found');
exit;
}
?>
Werfen Sie einen Blick auf http://stackoverflow.com/questions/597159/sending-large-files-reliably-in-php, gibt es eine Antwort über die 'X-SENDFILE' Header. Überprüfen Sie jedoch, ob Ihr Host diese Kopfzeile unterstützt. – Joost
Ich glaube nicht, dass es relevant ist, aber ich verwende ASIHTTPRequest-Bibliothek, um die Anfrage zu stellen. Ich baue einen ASIFormDataRequest und setze einen downloadDestinationPath. – dnaxxx
Es scheint, dass x-sendfile nicht unterstützt wird, da die Antwort sofort eintrifft, mit Statuscode 200, aber ohne die Datei. Ich werde Siteground fragen, ob ich es aktivieren kann. – dnaxxx