Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как отдать пользователю файл скриптом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: или форсированная скачка
valenok Модератор
Отправлено: 12 Апреля, 2007 - 15:29:07
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




download.php
PHP:
скопировать код в буфер обмена
  1.  
  2. $file = ("mashka.rar");
  3. header ("Content-Type: application/octet-stream");
  4. header ("Accept-Ranges: bytes");
  5. header ("Content-Length: ".filesize($file));
  6. header ("Content-Disposition: attachment; filename=".$file);  
  7. readfile($file);
  8.  


Тогда пользователь зашедший на download.php предстанет перед выбором
что делать с файлом mashka.rar Сохранить на диск, открыть или отменить скачку.


-----
Truly yours, Sasha.
 
My status
 Top
-SCHATTEN-
Отправлено: 12 Апреля, 2007 - 18:04:23
Post Id



Пользователь


Покинул форум
Сообщений всего: 615
Дата рег-ции: Июль 2006  
Откуда: Оттуда !


Помог: 0 раз(а)




Пасибо огромное.
 
 Top
valenok Модератор
Отправлено: 16 Июля, 2007 - 14:42:19
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Вашему вниманию поддержка докачки:

PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP
  3.  function output_file($file,$name)
  4.  {
  5.  //do something on download abort/finish
  6.  //register_shutdown_function( 'function_name'  );
  7.  if(!file_exists($file))
  8.  die('file not exist!');
  9.  $size = filesize($file);
  10.  $name = rawurldecode($name);
  11.  
  12.  if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
  13.  $UserBrowser = "Opera";
  14.  elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
  15.  $UserBrowser = "IE";
  16.  else
  17.  $UserBrowser = '';
  18.  
  19.  /// important for download im most browser
  20.  $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ?
  21.   'application/octetstream' : 'application/octet-stream';
  22.  @ob_end_clean(); /// decrease cpu usage extreme
  23.  header('Content-Type: ' . $mime_type);
  24.  header('Content-Disposition: attachment; filename="'.$name.'"');
  25.  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  26.  header('Accept-Ranges: bytes');
  27.  header("Cache-control: private");
  28.  header('Pragma: private');
  29.  
  30.  /////  multipart-download and resume-download
  31.  if(isset($_SERVER['HTTP_RANGE']))
  32.  {
  33.  list($a, $range) = explode("=",$_SERVER['HTTP_RANGE']);
  34.  str_replace($range, "-", $range);
  35.  $size2 = $size-1;
  36.  $new_length = $size-$range;
  37.  header("HTTP/1.1 206 Partial Content");
  38.  header("Content-Length: $new_length");
  39.  header("Content-Range: bytes $range$size2/$size");
  40.  }
  41.  else
  42.  {
  43.  $size2=$size-1;
  44.  header("Content-Length: ".$size);
  45.  }
  46.  $chunksize = 1*(1024*1024);
  47.  $bytes_send = 0;
  48.  if ($file = fopen($file, 'r'))
  49.  {
  50.  if(isset($_SERVER['HTTP_RANGE']))
  51.  fseek($file, $range);
  52.  while(!feof($file) and (connection_status()==0))
  53.  {
  54.  $buffer = fread($file, $chunksize);
  55.  print($buffer);//echo($buffer); // is also possible
  56.  flush();
  57.  $bytes_send += strlen($buffer);
  58.  //sleep(1);//// decrease download speed
  59.  }
  60.  fclose($file);
  61.  }
  62.  else
  63.  die('error can not open file');
  64.  if(isset($new_length))
  65.  $size = $new_length;
  66.  die();
  67.  }
  68.  ?>
  69.  
  70.  




http://wordpress[dot]macosbrain[dot]com/2006/04/30/
php.net@macosbrain.com


-----
Truly yours, Sasha.
 
My status
 Top
Yuriy
Отправлено: 02 Января, 2008 - 21:12:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 142
Дата рег-ции: Июнь 2007  
Откуда: Азов


Помог: 0 раз(а)




valenok, что-то я ничего не понял из вашего сценария...

Например, возникла такая задача. Есть файл http://my-site.ru/files/file.rar/, юзер набирает в браузере этот адрес, а мне нужно сделать, чтобы загрузка НЕ произошла, а пользователь мог получить данный файл ТОЛЬКО если, скажем, введёт пароль с определённой стрнаицы с формой. Может, здесь нужно задействовать .htaccess? Я его почти не знаю. Что порекомендуете?


-----
Yuriy
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 00:02:49
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Yuriy пишет:

Например, возникла такая задача. Есть файл http://my-site.ru/files/file.rar, юзер набирает в браузере этот адрес, а мне нужно сделать, чтобы загрузка НЕ произошла, а пользователь мог получить данный файл ТОЛЬКО если, скажем, введёт пароль с определённой стрнаицы с формой.

Ссылка для скачивания должна иметь вид
PHP:
скопировать код в буфер обмена
  1.  
  2. <a href="http://mysite.ru/downloads/index.php">Скачать файл</a>
  3.  

Ну а сам файл index.php имеет вид
PHP:
скопировать код в буфер обмена
  1.  
  2. if ( isset( $_SESSION['auth'] ) ) // если пользователь авторизован
  3. {
  4.  $file = "files/archive.rar";
  5.  header ("Content-Type: application/octet-stream");
  6.  header ("Accept-Ranges: bytes");
  7.  header ("Content-Length: ".filesize($file));  
  8.  header ("Content-Disposition: attachment; filename=".$file);  
  9.  readfile($file);
  10. }
  11. else // пользователь не авторизован
  12. {
  13.   echo 'Скачивать файлы могут только зарегистрированные пользователи';
  14. }
  15.  

Чтобы файл archive.rar нельзя было скачать напрямую, надо защитить директорию
/downloads/files/
с помощью .htaccess, поместив в него строку
Deny from all
 
 Top
Yuriy
Отправлено: 03 Января, 2008 - 02:47:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 142
Дата рег-ции: Июнь 2007  
Откуда: Азов


Помог: 0 раз(а)




evgenijj, спасибо большое, всё работает! Улыбка

Понимаете, я такой человек, который хочет понять, а не просто получить готовое решение. Можете парай слов объяснить как это работает, что за механизм используется? Не откажусь от небольшого комментария к каждой строке по ветке 'then' Улыбка Естественно, кроме первой...


-----
Yuriy
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 11:07:45
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Yuriy пишет:

Понимаете, я такой человек, который хочет понять, а не просто получить готовое решение. Можете парай слов объяснить как это работает, что за механизм используется? Не откажусь от небольшого комментария к каждой строке по ветке 'then' Улыбка Естественно, кроме первой...


http://phpclub[dot]ru/detail/article[dot][dot][dot]t?printVersion=1
http://support[dot]microsoft[dot]com/kb/q260519/
http://spherix[dot]jeka[dot]ru/index.php[dot][dot][dot]e=2&prnt=944
http://www[dot]ietf[dot]org/rfc/rfc1806[dot]txt
 
 Top
Yuriy
Отправлено: 03 Января, 2008 - 18:00:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 142
Дата рег-ции: Июнь 2007  
Откуда: Азов


Помог: 0 раз(а)




evgenijj, спасибо! Стало "светлее" ;)


-----
Yuriy
 
 Top
Yuriy
Отправлено: 06 Января, 2008 - 00:46:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 142
Дата рег-ции: Июнь 2007  
Откуда: Азов


Помог: 0 раз(а)




Посветлело, но не настолько, чтобы решить очередной вопрос. Положил картинку в эту же защищённую с помощью .htaccess директорию. Просто так она недоступна. Теперь мне нужно, чтобы пользователь с паролем не скачать её мог, а посмотреть на экране. То есть, программа должна вывести её в <img>.

Я в тупике…


-----
Yuriy
 
 Top
evgenijj
Отправлено: 06 Января, 2008 - 01:33:53
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Yuriy пишет:
Посветлело, но не настолько, чтобы решить очередной вопрос. Положил картинку в эту же защищённую с помощью .htaccess директорию. Просто так она недоступна. Теперь мне нужно, чтобы пользователь с паролем не скачать её мог, а посмотреть на экране. То есть, программа должна вывести её в < img>.

Я в тупике…


А вот это уже не по теме. Но вообще, это делается так
< img src="image.php?name=picture.png" />
Файл image.php
1. проверяет существование файла './downloads/files/'.$_GET['name']
2. считывает файл изображения с помощью функций imagecreatefrompng(), imagecreatefromjpeg(), imagecreatefromgif()
$img = imagecreatefrompng( './downloads/files/'.$_GET['name'] )
3. посылает заголовок header('Content-type: image/png'); (или jpg, или gif)
4. выводит изображение в браузер imagepng($img);
5. освобождает память imagedestroy($img);

Подробности здесь
Обработка изображений средствами PHP
 
 Top
Yuriy
Отправлено: 06 Января, 2008 - 02:37:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 142
Дата рег-ции: Июнь 2007  
Откуда: Азов


Помог: 0 раз(а)




evgenijj, спасибо, работает! Приведу для остальных полный сценарий (у меня картинка в папке screenshots/screen1.gif).

index.html:

PHP:
скопировать код в буфер обмена
  1. ...
  2. <img src="image.php?name=screen1.gif" />
  3. ...


image.php:

PHP:
скопировать код в буфер обмена
  1. <?PHP  
  2.   if (file_exists("./screenshots/".$_GET['name']))
  3.   {
  4.     $img=imagecreatefromgif("./screenshots/".$_GET['name']);
  5.     header('Content-type: image/gif');
  6.     imagegif($img);
  7.     imagedestroy($img);
  8.   }
  9. ?>


-----
Yuriy
 
 Top
D1mOn
Отправлено: 29 Мая, 2008 - 13:38:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


А можно таким образом защитить директорию с видео/аудио файлами?
 
 Top
newdee
Отправлено: 06 Июня, 2008 - 07:27:27
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июнь 2008  


Помог: 0 раз(а)




кто нибудь знает, как ограничить скорость отдачи файла на PHP уровне. и возможно ли это.
(Добавление)
Улыбка сам нашел ответ

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // local file that should be send to the client
  3. $local_file = 'test-file.zip';
  4. // filename that the user gets as default
  5. $download_file = 'your-download-name.zip';
  6.  
  7. // set the download rate limit (=> 20,5 kb/s)
  8. $download_rate = 20.5;
  9. if(file_exists($local_file) && is_file($local_file))
  10. {
  11.     // send headers
  12.     header('Cache-control: private');
  13.     header('Content-Type: application/octet-stream');
  14.     header('Content-Length: '.filesize($local_file));
  15.     header('Content-Disposition: filename='.$download_file);
  16.  
  17.     // flush content
  18.     flush();
  19.  
  20.     // open file stream
  21.     $file = fopen($local_file, "r");
  22.  
  23.     while(!feof($file))
  24.     {
  25.         // send the current file part to the browser
  26.         print fread($file, round($download_rate * 1024));
  27.  
  28.         // flush the content to the browser
  29.         flush();
  30.  
  31.         // sleep one second
  32.         sleep(1);
  33.     }
  34.  
  35.     // close file stream
  36.     fclose($file);}
  37. else {
  38.     die('Error: The file '.$local_file.' does not exist!');
  39. }
  40. ?>
 
 Top
Вездеход
Отправлено: 06 Июня, 2008 - 07:40:09
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




D1mOn пишет:
А можно таким образом защитить директорию с видео/аудио файлами?

этим способом нельзя. можно файликом .htaccess


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
ASHOOT-x86
Отправлено: 06 Августа, 2008 - 23:09:58
Post Id



Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2008  
Откуда: Россия, Краснодар


Помог: 0 раз(а)




Парни, все пучком. Вот представьте такой пример, скорость инета у юзера оч маленькая (например пользователь мобилу использует как модем). Он начал качку большого файла форсированным данным методом, в диспетчере задач висит задача PHP.exe и ее размер в оперативе - размер файла, который он качает и прекратится эта задача только когда пользователь окончательно заберет файл, либо прервет скачивание. Будет нагрузка на проц, около 5%. Представьте, если несколько будет таких пользователей одновременно...... Че, сидеть и завершать процессы PHP.exe и тем самым прерывать загрузку файла...? Я знаю что. Если это хостинг, вас оттуда пошлют и закроют аккуант, если ваш личный сервер - просто спалите его и останетесь на бобах. Думайте.
(Добавление)
И еще, мужики, забыл сказать, что в оперативе хранится все, что пых передал в буфер, все что выполняется и сторонние процессы. Если еще использовать и ограничитель по скорости, то мы вообще несколько тяжелых функций используем. Капец будет компу при первом же качки через такой скрипт Недовольство, огорчение


-----
PHP - рулезУлыбка
 
My status
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB