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

Odpowiedz Nowy wątek
2015-10-31 15:32
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?

Pozostało 580 znaków

2015-10-31 15:37
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);
    }
}

Pozostało 580 znaków

2015-10-31 15:52

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.

Tu masz krócej, może wystarczy: http://stackoverflow.com/questions/20956434/create-download-link-for-music-or-video (swoją drogą nie było trudno to znaleźć). - Maciej Cąderek 2015-10-31 16:37
Zaraz wytestuję, dzięki za pomoc. - Mostek87 2015-10-31 16:43

Pozostało 580 znaków

2015-10-31 16:12
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.).

Pozostało 580 znaków

2015-10-31 16:33
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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