[ICMS2] Сохранение данных из базы данных в файл на ПК пользователя

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 4 января 2015 в 11:29
Уважаемые Гуру!
Помогите разобраться с проблемой.

Задача.
Взять данные из базы данных, записать их в файл нужным форматом и выдать его пользователю для сохранения на компьютере.
Для простоты назовем его экшином "SAVE"

Вроде все сделал, а на последнем этапе — затык.
После появления окна для выбора места куда сохранить файл, файл сохраняется как положено, а вот вместо того, чтобы по логике компонент должен вернулся туда откуда был запущен экшин "SAVE" — на окне крутиться AJAX-круг и все.
Такое ощущение что AJAX не может получить данные для перерисовке страницы.

Как полечить?


  1.  
  2. <?php
  3. class actionMypatchPatchSave extends cmsAction {
  4.  
  5. public function run($patch_id=false){
  6. ...
  7. $mypatch_error = $this->PatchSave($patch_id);
  8. ...
  9. $this->redirectToAction('');
  10.  
  11. }
  12.  
  13.  
  14. private function PatchSave($patch_id=false) {
  15. .......
  16. header('Content-Description: File Transfer');
  17. header('Content-Type: application/octet-stream');
  18. header('Content-Disposition: attachment; filename=' . basename($file_temp));
  19. header('Content-Transfer-Encoding: binary');
  20. header('Expires: 0');
  21. header('Cache-Control: must-revalidate');
  22. header('Pragma: public');
  23. header('Content-Length: ' . filesize($file_temp));
  24. readfile($file_temp);
  25.  
  26. return $mypatch_error;
  27.  
  28. }
  29.  
  30. }
  31.  
  32.  
  33.  
  34.  
#2 4 января 2015 в 15:06
Ребят, не уж то не кто не поможет?
Мозг уже не соображает :(
#3 4 января 2015 в 18:21
Нашел я вроде место где все портиться.
Вообщем вот в этом куске кода:
  1.  
  2. header('Content-Description: File Transfer');
  3. header('Content-Type: application/octet-stream');
  4. header('Content-Disposition: attachment; filename=' . basename($file_temp));
  5. header('Content-Transfer-Encoding: binary');
  6. header('Expires: 0');
  7. header('Cache-Control: must-revalidate');
  8. header('Pragma: public');
  9. header('Content-Length: ' . filesize($file_temp));
  10.  
портиться основной заголовок.
И когда идет попытка редирекнуться куда надо, в заголовке черти что.
Помогите найти где эти значения и подсмотреть какие они должны быть — эти значения.
Например в NetBeans-е можно глянуть их значения перед тем как я их начинаю "портить"?
#4 4 января 2015 в 18:58
Завершить ajax запрос можно exit;
Системное прерывание ajax ICMS это $this->halt();
  1. // заставляем браузер показать окно сохранения файла
  2. header('Content-Description: File Transfer');
  3. header('Content-Type: application/octet-stream');
  4. header('Content-Disposition: attachment; filename=' . basename($file));
  5. header('Content-Transfer-Encoding: binary');
  6. header('Expires: 0');
  7. header('Cache-Control: must-revalidate');
  8. header('Pragma: public');
  9. header('Content-Length: ' . filesize($file));
  10. // читаем файл и отправляем его пользователю
  11. readfile($file);
  12. exit;
  13.  
#5 4 января 2015 в 19:10
Геннадий Иванович, пробовал. Не выходит аленький цветочек.
Тут в самой системе наткнулся на кусок кода который отвечает за загрузку файлов.
Но все равно пока не получается им воспользоваться. :(

Александр, да причем тут вирусы? roflЕщё и нод32 предлагать… Ну Вы даете. Я врагу своему не пожелаю такой псевдоантивирус.
Да и ещё — я в "песочнице" сижу. Так что вирусы тут не причем.
#6 4 января 2015 в 19:18
Вот нашел функцию в самом движке
  1.  
  2. public function actionDownload($id, $url_key){
  3.  
  4. if (!$id || !$url_key) { return cmsCore::error404(); }
  5.  
  6. $file = $this->model->getFile($id);
  7.  
  8. if ($file['url_key'] != $url_key) { cmsCore::error404(); }
  9.  
  10. $filename = cmsConfig::get('upload_path') . $file['path'];
  11. $original_filename = $file['name'];
  12.  
  13. $this->model->incrementDownloadsCounter($file['id']);
  14.  
  15. header("Content-Type: application/force-download");
  16. header("Content-Length: " . filesize($filename));
  17. header('Content-Disposition: attachment; filename="' . $original_filename . '"');
  18.  
  19.  
  20. readfile($filename);
  21.  
  22. $this->halt();
  23.  
  24. }
  25.  
Вроде практически как у меня. Да я уже и его выдрал и пытаюсь им "выдать" файл пользователю.
Файл сохраняется — но перенаправления не происходит.
Крутиться иконка ajax и все.
Помогает только обновление страницы :(
#7 4 января 2015 в 19:30
Скорпион, но ведь в функции actionDownload нет редиректа, может стоить в код добавить$this->redirectBack();?
#8 4 января 2015 в 19:36
Evanescence, как не редиректится?
а — $this->redirectToAction('');
В первом сообщении.....

P.S. Попробовал и Ваш вариант — неа :(
#9 4 января 2015 в 19:38
все таки думаю все дело в заголовках которые назначаются header (). Где бы увидеть их значение во время работы?
#10 4 января 2015 в 19:42
Скорпион, не обратил внимание на actionMypatchPatchSave
тогда может обновиться/перенаправить страницу с помощью js если в вашем компоненте есть tpl файл, например так:
  1. document.location.href = "СТРАНИЦА_ПЕРЕНАПРАВЛЕНИЯ"}
#11 4 января 2015 в 19:47

Где бы увидеть их значение во время работы?

Скорпион
В хроме
#12 4 января 2015 в 19:47
Evanescence, есть.

  1.  
  2. <?php
  3. $this->addToolButton(array(
  4. 'class' => 'add',
  5. 'title' => LANG_MYPATCH_ADD,
  6. 'href' => href_to($this->controller->root_url, 'patch_add')
  7.  
  8. ));
  9. ?>
  10.  
  11. <?php $this->renderGrid($this->href_to('patch_ajax'), $grid);
  12.  
Только вот не пойму куда его тут пихать.
#13 4 января 2015 в 20:41
Скорпион, извиняюсь не туда)) написал (странной очень как суда именно попало, наверное судьба!)
Уважаемый, а почему довольно хороший и надежный антивирус вы считаете псевдо? потому, что он делается не у нас(точнее у Вас в Стране,
у меня на родине пока во-общее антивирус не один не начинали создавать(вроде)
)? или простое не доверие к нему(чувствуется не объективность и предвзятость)))
Я вот лично бы лучше поставил например 100 раз нод32 чем тот же бесплатный аваст smileи многие другие (да и сорри, что оффтоп и не по теме)
#14 4 января 2015 в 20:48
Александр, ответил в личку.
По делу есть что сказать? Голова совсем не соображает у мну :(
#15 4 января 2015 в 22:44
Скорпион, вы не можете отдать пользователю файл и сделать редирект одновременно в рамках одного запроса.
Либо то, либо другое.
Если принципиально чтобы файл загружался не в том месте, где нажали "Сохранить", а на другой странице, то нужно сначала перейти на эту страницу, а затем уже вызывать URL отдающий файл. Как это сделано здесь.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.