1

Тема: Загрузчик на php

Як зробити скрипт який буде скачувати з сайту файл ?
Наприклад rar архів.
Хоч підкажіть в якому напрямку шукати.

2

Re: Загрузчик на php

Вже зробили. wget називається.

3 Востаннє редагувалося koala (06.08.2015 11:19:05)

Re: Загрузчик на php

URL-и в PHP відкриваються так само, як і звичайні файли: fopen, file, file_get_contents. Тобто задача, якщо файл загальнодоступний (без логіну на сайті і т.д.) зводиться до звичайного копіювання файлів. Якщо ж щось нетривіальне, то треба cURL використовувати.

Подякували: Fox1

4

Re: Загрузчик на php

quez написав:

Вже зробили. wget називається.

Дякую!!!!

5

Re: Загрузчик на php

koala написав:

URL-и в PHP відкриваються так само, як і звичайні файли: fopen, file, file_get_contents. Тобто задача, якщо файл загальнодоступний (без логіну на сайті і т.д.) зводиться до звичайного копіювання файлів. Якщо ж щось нетривіальне, то треба cURL використовувати.

Ось знайшов

<?php
function downloadFile($filename, $mimetype='application/octet-stream') {
    if (!file_exists($filename)) die('Файл не найден ' . $filename);

    $from=$to=0; $cr=NULL;

    if (isset($_SERVER['HTTP_RANGE'])) {
        $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1);
        $from=strtok($range, '-');
        $to=strtok('/'); if ($to>0) $to++;
        if ($to) $to-=$from;
        header('HTTP/1.1 206 Partial Content');
        $cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):filesize($filename));
    } else  header('HTTP/1.1 200 Ok');

    $etag=md5($filename);
    $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8);
    header('ETag: "' . $etag . '"');

    header('Accept-Ranges: bytes');
    header('Content-Length: ' . (filesize($filename)-$to+$from));
    if ($cr) header($cr);

    header('Connection: close');
    header('Content-Type: ' . $mimetype);
    header('Last-Modified: ' . gmdate('r', filemtime($filename)));
    $f=fopen($filename, 'r');
    header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
    if ($from) fseek($f, $from, SEEK_SET);
    if (!isset($to) or empty($to)) {
        $size=filesize($filename)-$from;
    } else {
        $size=$to;
    }

    $downloaded=0;

    while(!feof($f) and !connection_status() and ($downloaded<$size)) {
        echo fread($f, 512000);
        $downloaded+=512000;
        flush();
    }
    fclose($f);
}
downloadFile($_GET['file']);
?>

6

Re: Загрузчик на php

Слід також зауважити, що на багатьох хостингах існує заборона відкривати адреси зовнішніх сайтів. Тобто, потрібно також мати певні права доступу, щоб php-скрипт на сервері міг щось завантажити з іншого сервера.

Як саме стоїть задача — написати серверний скрипт, який скачує з зовнішніх сайтів файли на свій сервер (тоді див. відповідь Коали плюс зауваження про права доступу)? Чи скачати щось на локальний комп'ютер (для цього справді годиться wget, але до чого тут php?)?

7

Re: Загрузчик на php

P.Y. написав:

Слід також зауважити, що на багатьох хостингах існує заборона відкривати адреси зовнішніх сайтів. Тобто, потрібно також мати певні права доступу, щоб php-скрипт на сервері міг щось завантажити з іншого сервера.

Як саме стоїть задача — написати серверний скрипт, який скачує з зовнішніх сайтів файли на свій сервер (тоді див. відповідь Коали плюс зауваження про права доступу)? Чи скачати щось на локальний комп'ютер (для цього справді годиться wget, але до чого тут php?)?

Зробить кнопку "Скачать".

8 Востаннє редагувалося P.Y. (06.08.2015 12:48:40)

Re: Загрузчик на php

В найпростішому випадку — зробити на сторінці посилання на скачуваний файл:

<a href="YOURFILE.RAR">Скачати</a>

Частина проблеми полягає в тому, що сервер може не розпізнавати даний тип файлів за розширенням і передавати його як html, у результаті чого замість діалогу скачування вилазить сторінка з кракозябликами (хоча скачування через праву кнопку працює). Тобто, в конфігураційних файлах (у випадку Апача, це mime.types) має бути прописана асоціація розширення з назвою типу (для rar-архівів: application/x-rar-compressed rar). Або ж, якщо файли конфігурації недоступні, можна написати скрипт, який містить інструкцію

header('Content-Type: application/x-rar-compressed');

після чого зчитує потрібний rar-архів і виводить його через echo. В такому разі, на сторінці скачування треба буде зробити посилання не на сам архів, а на цей скрипт, що прописує тип і, можливо, виконує якісь додаткові дії.

Подякували: koala, Fox2