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
Форумы портала PHP.SU :: Версия для печати :: Как отдать пользователю файл скриптом
Форумы портала PHP.SU » PHP » Пользовательские функции » Как отдать пользователю файл скриптом

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

1. valenok - 12 Апреля, 2007 - 15:29:07 - перейти к сообщению
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 Сохранить на диск, открыть или отменить скачку.
2. -SCHATTEN- - 12 Апреля, 2007 - 18:04:23 - перейти к сообщению
Пасибо огромное.
3. valenok - 16 Июля, 2007 - 14:42:19 - перейти к сообщению
Вашему вниманию поддержка докачки:

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
4. Yuriy - 02 Января, 2008 - 21:12:11 - перейти к сообщению
valenok, что-то я ничего не понял из вашего сценария...

Например, возникла такая задача. Есть файл http://my-site.ru/files/file.rar/, юзер набирает в браузере этот адрес, а мне нужно сделать, чтобы загрузка НЕ произошла, а пользователь мог получить данный файл ТОЛЬКО если, скажем, введёт пароль с определённой стрнаицы с формой. Может, здесь нужно задействовать .htaccess? Я его почти не знаю. Что порекомендуете?
5. evgenijj - 03 Января, 2008 - 00:02:49 - перейти к сообщению
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
6. Yuriy - 03 Января, 2008 - 02:47:19 - перейти к сообщению
evgenijj, спасибо большое, всё работает! Улыбка

Понимаете, я такой человек, который хочет понять, а не просто получить готовое решение. Можете парай слов объяснить как это работает, что за механизм используется? Не откажусь от небольшого комментария к каждой строке по ветке 'then' Улыбка Естественно, кроме первой...
7. evgenijj - 03 Января, 2008 - 11:07:45 - перейти к сообщению
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
8. Yuriy - 03 Января, 2008 - 18:00:55 - перейти к сообщению
evgenijj, спасибо! Стало "светлее" ;)
9. Yuriy - 06 Января, 2008 - 00:46:05 - перейти к сообщению
Посветлело, но не настолько, чтобы решить очередной вопрос. Положил картинку в эту же защищённую с помощью .htaccess директорию. Просто так она недоступна. Теперь мне нужно, чтобы пользователь с паролем не скачать её мог, а посмотреть на экране. То есть, программа должна вывести её в <img>.

Я в тупике…
10. evgenijj - 06 Января, 2008 - 01:33:53 - перейти к сообщению
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
11. Yuriy - 06 Января, 2008 - 02:37:34 - перейти к сообщению
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. ?>
12. D1mOn - 29 Мая, 2008 - 13:38:35 - перейти к сообщению
А можно таким образом защитить директорию с видео/аудио файлами?
13. newdee - 06 Июня, 2008 - 07:27:27 - перейти к сообщению
кто нибудь знает, как ограничить скорость отдачи файла на 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. ?>
14. Вездеход - 06 Июня, 2008 - 07:40:09 - перейти к сообщению
D1mOn пишет:
А можно таким образом защитить директорию с видео/аудио файлами?

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

 

Powered by ExBB FM 1.0 RC1