Замена ссылки на скачивание файла

Главные вкладки

Аватар пользователя darkpp darkpp 8 февраля 2017 в 17:14

Здравствуйте! Очень надеюсь на вашу помощь, так как уже потихоньку начинаю выходить из себя и раздумывать о запое.

Суть в следующем. Есть сайт, на котором к материалу "Текстовая страница" можно добавлять файлы - для этого есть группа полей field_grouped_files_files. Ссылка на скачивание файла работает через file_create_url($item['uri']) - т.е., отдает прямой путь к файлу.

Но. Мне необходимо сделать так, чтобы ссылка на скачивание была вида system/download/$fid. Попробовал воспользоваться следующим способом:

<?php
/**
 * Implementation of hook_menu()
 */
function mymodule_menu() {
  
$items['download/%file'] = array(
    
'page callback' => 'mymodule_download_file',
    
'access arguments' => array('administer site configuration'),
    
'type' => MENU_CALLBACK,
  );
  return 
$items;
}
 
/**
 * Page callback for forcing a file to download
 */
function mymodule_download_file($file) {
  if(
$file) {
    
file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
  }
  else {
    return 
drupal_access_denied();
  }
}
?>

Но максимум, чего смог добиться — 403 ошибки. Иногда 404. Плагины типа Download File работают так же: то 403, то 404, т.е. их, пожалуйста, не предлагайте.

Надеюсь на вашу помощь, спасибо!

Лучший ответ

Аватар пользователя darkpp darkpp 8 февраля 2017 в 18:30

насчет второго не уверен. как можно это проверить?

Комментарии

Аватар пользователя bumble bumble 8 февраля 2017 в 18:17
1

Давайте пробовать решать...

Для начала, нужно аргумент $file - передавать из хука меню:

<?php
/**
 * Implementation of hook_menu()
 */
function mymodule_menu() {
  
$items['download/%file'] = array(
    
'page callback'    => 'mymodule_download_file',
    
'page arguments'   => array(1), // Передаем аргумент в коллбек
    
'access arguments' => array('administer site configuration'),
    
'type'             => MENU_CALLBACK,
  );

  return 

$items;
}
?>

2-е. Вы уверены что существует вайлдкард %file ? Файл приходит в коллбек mymodule_download_file?

Аватар пользователя darkpp darkpp 8 февраля 2017 в 18:31

bumble wrote:

2-е. Вы уверены что существует вайлдкард %file ? Файл приходит в коллбек mymodule_download_file?

насчет второго не уверен. как можно это проверить?

Аватар пользователя bumble bumble 8 февраля 2017 в 19:05
1

darkpp wrote:

как можно это проверить?

Можно установить модуль Devel, и посмотреть ф-цией dpm():

<?php
function mymodule_download_file($file) {
  
dpm($file); // Выведет значение переменной на экран
  
if($file) {
    
file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
  }
  else {
    return 
drupal_access_denied();
  }
}
?>

Ну, или стандартными var_dump, var_export, print_r...

Так же, учитывайте, что ссылку должен смотреть администратор, в разрешениях указаны права 'administer site configuration'.

PS - перестаньте модераторов звать Lol Только хуже делаете

Аватар пользователя darkpp darkpp 9 февраля 2017 в 11:25

хм. HTTP ERROR 503 в ответ.

я правильно все сделал? вытащил блок "выполнить php" в футер, там запустил код. залогинен был под админом.

P. S. виноват, исправляюсь Smile

Аватар пользователя bumble bumble 9 февраля 2017 в 11:35
1

darkpp wrote:

я правильно все сделал? вытащил блок "выполнить php" в футер, там запустил код.

Нет! НЕЕЕТ! И еще - 1000 раз нет!

Весь код реализуется в рамках модулей, в крайнем случае - в теме.

Аватар пользователя darkpp darkpp 9 февраля 2017 в 14:06

добавлял код в модуль, в итоге ничего не увидел.

вот это поле:
поле

но где сами файлы? я уже либо путаюсь, либо туплю Sad

Аватар пользователя bumble bumble 9 февраля 2017 в 14:40
1

А сам файл с вызываемым FID'ом есть?

Должен приходить файл, если существует.
Что выводит dpm($file); в коллбеке?

Если объект файла - должно работать. Если только FID - инициализируйте загрузку файла ( file_load($fid) ) перед обработкой.

И не забывайте что в коллбеке нужно возвращать результат:

<?php
function mymodule_download_file($file) {
  
dpm($file); // Выведет значение переменной на экран
  
if($file) {
    
// Используйте return
    
return file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
  }
  else {
    return 
drupal_access_denied();
  }
}
?>
Аватар пользователя darkpp darkpp 9 февраля 2017 в 16:20

в общем, что я имею.

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

и он работает с дефолтными настройками: по ссылке download/file/fid/%fid все скачивается замечательно. но как только я вписываю туда system/download/file/fid/%fid, сразу все падает с 403 ошибкой даже под админом.

ссылка такого вида нужна для работы счетчика скачиваний.

можете посоветовать, в какую сторону копать?

Аватар пользователя darkpp darkpp 9 февраля 2017 в 16:30

в коде модуля есть такой фрагмент:

<?php
function download_file_menu() {
  
$items['download/file/fid/%'] = array(
      
'title'            => 'Download file',
      
'page callback'       => 'download_file_direct_download',
      
'page arguments'   => array(3),
      
'access arguments' => TRUE,
  );

}

?>

вот туда пробовал вписать.

Аватар пользователя bumble bumble 9 февраля 2017 в 11:37
1

darkpp wrote:

хм. HTTP ERROR 503 в ответ.

Вангую, что пропущен основной шаг:

bumble wrote:

Можно установить модуль Devel, и посмотреть ф-цией dpm():