Перейти к содержимому

Сервис обмена электронных валют


  • Закрытая тема Тема закрыта

Кнопка для загрузки картинки

#1 Anatoly

Anatoly
  • Пользователь
  • 50 сообщений
  • Репутация: 0
0

Отправлено 28 Декабрь 2009 - 00:37

Привет, форумчане! У меня есть такой вопрос, который уже несколько месяцев мучает меня.

Как можно сделать кнопку для загрузки картинки, если кто знает, как на сайте http://www.telpics.r...p?id=15725&c=21

Ведь, если сделать просто ссылку на картинку, то она и будет открываться без всякого предложения скачать ее себе на комп.

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 30 Декабрь 2009 - 00:35

Anatoly, запросто :(
Нужно выдать её не на экран, а побайтово(файл upload.php):
<?php

$down_size = filesize($_GET['path_download']); // получаем размер закачиваемого файла
$down_file = basename($_GET['path_download']); // получаем имя закачиваемого файла
header("Content-Length: {$down_size}"); // передаём в заголовки размер закачки
header("Content-Disposition: attachment; filename={$down_file}"); // Content-disposition — это расширение протокола MIME, указывающее агенту пользователя MIME, как отображать вложенный файл
header("Content-type: application/x-force-download; name=\"{$down_file}\""); // сообщаем о том, что собираемся отдавать файл
readfile($_GET['path_download']); // выдаём файл побайтово

}

?>


Страница с ссылкой на скачку:
<html>
...
<a href="upload.php?path_download=[путь до файла от upload.php]">Закачать картинку</a>
...
</html>


Внимание: Данный пример примитивен, он просто показывает как можно выдать картинку на закачку, но он совсем не защищен!
  • 0

#3 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Март 2010 - 03:13

Вот неплохой скрипт закачки. С докачкой. =)

<?php
function downloadFile($filename) {
if (!file_exists($filename)) die("Файл <B>{$filename}</b> не найден");

$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('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);
}
?>

  • 0

#4 bestolloch

bestolloch
  • Пользователь
  • 224 сообщений
  • Репутация: 1

Отправлено 27 Июнь 2010 - 10:03

А код вставляется непосредственно в index.php? просто php для меня закрытая книга. А кнопку охото.)


  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 27 Июнь 2010 - 12:55

bestolloch, код можно вставить в тот файл, где данная функция будет использоваться. Вообще всё зависит от вашей системы, как вы её разработали...
  • 0

#6 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 27 Июнь 2010 - 19:40

Вот код, который лучше, чем предыдущий, ибо он не ограничивает размера файла и исправляет одну ошибку, которая есть в предыдущем коде. В опере все файлы предлагает скачать как html. В новом коде, такого нет.

function downloadFile($filepath, $mimetype = 'text/plain') {
$fsize = filesize($filepath); // берем размер файла
$ftime = date('D, d M Y H:i:s T', filemtime($filepath)); // определяем дату его модификации

$fd = @fopen($filepath, 'rb'); // открываем файл на чтение в бинарном режиме

if (isset($_SERVER['HTTP_RANGE'])) { // поддерживается ли докачка?
$range = $_SERVER['HTTP_RANGE']; // определяем, с какого байта скачивать файл
$range = str_replace('bytes=', '', $range);
list($range, $end) = explode('-', $range);

if (!empty($range)) {
fseek($fd, $range);
}
} else { // докачка не поддерживается
$range = 0;
}

if ($range) {
header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content'); // говорим браузеру, что это часть какого-то контента
} else {
header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); // стандартный ответ браузеру
}

// прочие заголовки, необходимые для правильной работы
header('Content-Disposition: attachment; filename='.basename($filepath));
header('Last-Modified: '.$ftime);
header('Accept-Ranges: bytes');
header('Content-Length: '.($fsize - $range));
if ($range) {
header("Content-Range: bytes $range-".($fsize - 1).'/'.$fsize);
}
header('Content-Type: '.$mimetype);

fpassthru($fd); // отдаем часть файла в браузер (программу докачки)
fclose($fd);

exit;
}

  • 0

#7 Osip

Osip
  • Пользователь
  • 9 сообщений
  • Репутация: 0

Отправлено 31 Июль 2010 - 07:56

там не ошибка, там просто MIME тип явно не указывается, т.е. в твоем скрипте вот эта строчка "решает" )

header('Content-Type: '.$mimetype); //$mimetype в данном случае text/plain


так что в тот скрипт который был выше просто header() добавить =)


  • 0

#8 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 31 Июль 2010 - 16:11

ну, по-моему это, как раз таки, ошибка. =)
  • 0

#9 CashMagnat

CashMagnat
  • Пользователь
  • 24 сообщений
  • Репутация: 0

Отправлено 05 Август 2010 - 01:06

Учитывайте максимальное количество байт. См в рнр.ини
  • 0

#10 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 07 Август 2010 - 12:22

Данный вопрос касается только upload'a.
На скачку, насколько я знаю, ограничений нет.


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru