Videos mit linker Maustaste downloaden?

Hallo zusammen,

ich habe meine erste Homepage erstellt. Darauf präsentiere ich auch Videos. Die Videos sind zum Teil 150MB groß.
Die Videos sollen runtergeladen werden und nicht abgespielt werden, wenn man mit der linken Maustaste auf deren Hyperlink klickt.
Ich hatte daran gedacht, dies über ein PHP-Skript zu realisieren.
Das Problem, was ich bisher noch habe: Der Dateidownload bricht immer bei etwa 16MB ab. Kann mir jemand helfen, wie man die Videos in voller Länge herunterladen kann?

Hier das bisherige PHP-Skript:

<?php

// If user click the download link
if(isset($_GET['filename'])){
        // The directory of downloadable files
        // This directory should be unaccessible from web
        $file_dir="video/";
 
        // Replace the slash and backslash character with empty string
        // The slash and backslash character can be dangerous
        $file_name=str_replace("/", "", $_GET['filename']);
        $file_name=str_replace("\\", "", $file_name);
 
        // If the requested file is exist
        if(file_exists($file_dir.$file_name)){
                // Get the file size
                $file_size=filesize($file_dir.$file_name);
                // Open the file
                $fh=fopen($file_dir.$file_name, "r");
 
                // Download speed in KB/s
                $speed=50000;
 
                // Initialize the range of bytes to be transferred
                $start=0;
                $end=$file_size-1;
 
                // Check HTTP_RANGE variable
                if(isset($_SERVER['HTTP_RANGE']) &&
                        preg_match('/^bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $arr)){
 
                        // Starting byte
                        $start=$arr[1];
                        if($arr[2]){
                                // Ending byte
                                $end=$arr[2];
                        }
                }
 
                // Check if starting and ending byte is valid
                if($start>$end || $start>=$file_size){
                        header("HTTP/1.1 416 Requested Range Not Satisfiable");
                        header("Content-Length: 0");
                }
                else{
                        // For the first time download
                        if($start==0 && $end==$file_size){
                                // Send HTTP OK header
                                header("HTTP/1.1 200 OK");
                        }
                        else{
                                // For resume download
                                // Send Partial Content header
                                header("HTTP/1.1 206 Partial Content");
                                // Send Content-Range header
                                header("Content-Range: bytes ".$start."-".$end."/".$file_size);
                        }
 
                        // Bytes left
                        $left=$end-$start+1;
 
                        // Send the other headers
                        header("Content-Type: application/octet-stream");
                        header("Accept-Ranges: bytes");
                        // Content length should be the bytes left
                        header("Content-Length: ".$left);
                        header("Content-Disposition: attachment; filename=".$file_name);
 
                        // Read file from the given starting bytes
                        fseek($fh, $start);
                        // Loop while there are bytes left
                        while($left>0){
                                // Bytes to be transferred
                                // according to the defined speed
                                $bytes=$speed*1024;
                                // Read file per size
                                echo fread($fh, $bytes);
                                // Flush the content to client
                                flush();
                                // Substract bytes left with the tranferred bytes
                                $left-=$bytes;
                                // Delay for 1 second
                                sleep(1);
                        }
                }
 
                fclose($fh);
        }
        else{
                // If the requested file is not exist
                // Display error message
                echo "File not found!";
        }
 
        exit();
}
?>

Wenn du das Script einzig und allein dazu nutzen willst, den Download der Videos zu erzwingen (und keine Prüfung einer Zugangsberechtigung o.ä. da noch mit drin steckt) - dann ist das aus Performance-Gesichtspunkten eher ungünstig.

Vernünftiger wäre, dass über die Server-Konfiguration zu regeln - bspw. mit der ForceType- in Verbindung mit der Files-Direktive einen Content-Type zu erzwingen, der den Client zum Downloaden bringt.

danke für den Tipp.
Hab jetzt in meinem Rootdirectory in der htaccess folgendes eingetragen:

<FilesMatch "\.(wmv)$" >
ForceType application/octet-stream
</FilesMatch> 

Damit funktioniert es z.B. mit Firefox einwandfrei. Allerdings mit dem Internet Explorer wird das Video trotzdem noch abgespielt und nicht automatisch heruntergeladen. Was muss ich tun, damit der automatische Download auch im Internet Explorer funktioniert?

Eine Möglichkeit wäre eine kleine Erweiterung deines htaccess Beispiels:
givegoodweb.com/post/30/forc … d-htaccess

Versuch das mal :slight_smile:

Edit:
Funktioniert wahrscheinlichnur wenn mod_headers beim Apache geladen ist. Ob das hier (oder bei dir) der Fall ist, kan ich nicht sagen.

danke für die richtig guten Tips. Jetzt funktioniert es auch mit dem Internet Explorer.

Was mir allerdings noch aufgefallen ist: manchmal kommt es vor, dass er nur einen Teil des Videos herunterläd und dann abbricht. Und z.B. Firefox meldet anschließend: download complete.
Woran könnte es liegen, dass der Download sporadisch abbricht?
Beim Internet Explorer kenne ich es, dass er die eine Datei in sein Temp-Verzeichnis herunterläd und erst wenn der Download “completed” ist, wird diese Datei in das Zielverzeichnis kopiert. Meine Videos werden allerdings trotzdem erzeugt, auch wenn sie nur zum Teil heruntergeladen wurden.
Gibts auch Befehle, die man mit ins .htaccess integrieren kann, die dafür sorgen, dass nur von “completed Downloads” Dateien erzeugt werden?