Jak zrobić pobieranie pliku działające we wszystkich przeglądarkach?

0

Na serwerze znajdują się pliki mp4. Internauta klikając w link inicjuje pobieranie pliku. Szukałem w internecie i oczywiście znalazłem <a href="ścieżka do pliku" download>Pobierz</a> Problem polega na tym, że np. w takim FireFox'ie kliknięcie w taki link nie uruchamia ściągania tylko odpala film na nowej karcie. I pytanie? Jak zrobić aby to działało zawsze, na każdej przeglądarce?

1

Rozwiązanie znane mi w php. Może ktoś podpowie Tobie coś lepszego.

$Default_UserAgent = "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16";

function output_file($url, $name)
{
    stream_context_set_default(array(
        'http' => array(
            'method' => 'HEAD',
            'header' => 'User-Agent: ' . $Default_UserAgent
        )
    ));
    $head     = array_change_key_case(get_headers($url, true));
    $filesize = $head['content-length'];
    $filesize = intval($filesize);
    stream_context_set_default(array(
        'http' => array(
            'method' => 'GET',
            'header' => 'User-Agent: ' . $Default_UserAgent
        )
    ));
    preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
    $offset = intval($matches[1]);
    $size   = $filesize;
    @ob_end_clean();
    Header('Content-Type: application/octet-stream');
    Header('Content-Disposition: attachment; filename="' . $name . '"');
    Header("Content-Transfer-Encoding: binary");
    Header('Accept-Ranges: bytes');
    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
        list($range) = explode(",", $range, 2);
        list($range, $range_end) = explode("-", $range);
        $range = intval($range);
        if (!$range_end) {
            $range_end = $size - 1;
        } else {
            $range_end = intval($range_end);
        }
        $new_length = $range_end - $range + 1;
        Header("HTTP/1.1 206 Partial Content");
        Header("Content-Length: $new_length");
        Header("Content-Range: bytes $range-$range_end/$size");
    } else {
        $new_length = $size;
        Header("Content-Length: " . $size);
    }
    $chunksize = 4096;
    ob_clean();
    flush();
    if ($file = fopen($url, 'r')) {
        if (isset($_SERVER['HTTP_RANGE'])) {
            fseek($file, $offset, SEEK_CUR);
        }
        while (!feof($file)) {
            $buffer = fread($file, $chunksize);
            echo $buffer;
            flush();
        }
        fclose($file);
    }
}
0

Wow, nie sądziłem że aż tyle kodu potrzeba na w sumie prostą podstawową funkcję jak pobieranie pliku. Rozumiem, że gdybym chciał z tego skorzystać, musiałbym np. zrobić tak <a href = "pobierz.php">pobierz </a> I w pliku pobierz.php umieścić powyższy kod.

0

Dlaczego chcesz wymusić na użytkowniku pobranie zamiast zrobienia tego, co jest dla niego wygodniejsze (zakładając, że wygodny jest dla niego mechanizm przeglądarki)? Nie próbuj być na siłę mądrzejszy, jeżeli użytkownik chce od razu odtworzyć plik, to niech tak zrobi.
Rozwiązanie od olesio polega na ustawieniu ustawieniu odpowiedniego typu odpowiedzi i innych szczegółów w nagłówku (patrz chociażby na Content-Type), więc tak naprawdę nie jest to żadna magia i nie trzeba dużo kodu (w zależności od serwera, frameworka itp.).

1

Dlaczego chcesz wymusić na użytkowniku pobranie zamiast zrobienia tego, co jest dla niego wygodniejsze (zakładając, że wygodny jest dla niego mechanizm przeglądarki)? Nie próbuj być na siłę mądrzejszy, jeżeli użytkownik chce od razu odtworzyć plik, to niech tak zrobi.

Nic nie wymuszam. Jeżeli ktoś klika w "pobierz" to znaczy, że chce pobrać a nie chce aby plik otwierał mu się w przeglądarce.

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