Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Ответ сервера - файл для скачивания.


Recommended Posts

Здравствуйте! Есть задача - нужно, что бы на сервере формировался файл, который мог бы скачать пользователь, этим занимается отдельный метод в контроллере, который вызывается посредством AJAX запроса. На "Хабр Q&A" решение подобной задачи уже есть. Проблема заключается в том, что оно по какой то причине не работает - все заголовки отправляются, на фронт всё приходит, но вот файл никакой не качается. Скрины с ответом сервера и кодом прилагаю. 

image.thumb.png.9d0af7dee6f536088e14559467c8f858.png

image.png.58547ccfef2393eb1bc5ade513786f2e.png

image.thumb.png.88c19a272b6e91ae323011527b5a0eac.png

 

Пробовал ответ сервера делать через "echo" - результат точно такой же. 

Надіслати
Поділитися на інших сайтах


через ajax нельзя качать файл, но можно сделать скрытую ссылку и вызвать ее триггер вот пример для axios на ajax перепишите сами 
 

exportCompilation({state}) {
    this.$axios({
      url:  `/api/${state.compilation.id}/export`,
      method: 'GET',
      responseType: 'blob'
    }).then(response => {
      let fileURL = window.URL.createObjectURL(new Blob([response.data]))
      let fileLink = document.createElement('a')

      fileLink.href = fileURL
      fileLink.setAttribute('download', state.compilation.name + '.xlsx')
      document.body.appendChild(fileLink)

      fileLink.click()
    })
  },

 

  • +1 1
Надіслати
Поділитися на інших сайтах

  В 06.03.2022 в 15:50, spectre сказав:

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

Expand  

Да нет, суть заключается в том, что бы файл создавался "на лету" и не хранился на сервере. 

Надіслати
Поділитися на інших сайтах


  В 06.03.2022 в 15:58, Panda58dev сказав:

Да нет, суть заключается в том, что бы файл создавался "на лету" и не хранился на сервере. 

Expand  

тогда не аякс

Надіслати
Поділитися на інших сайтах

  В 06.03.2022 в 15:52, stickpro сказав:

через ajax нельзя качать файл, но можно сделать скрытую ссылку и вызвать ее триггер вот пример для axios на ajax перепишите сами 

Expand  

опять же - Вы предлагаете хранить файл на сервере.

Надіслати
Поділитися на інших сайтах


  В 06.03.2022 в 16:00, Panda58dev сказав:

А как отправлять запрос? 

Expand  

 

да на контроллер какой-то, типа common/download

Надіслати
Поділитися на інших сайтах

  В 06.03.2022 в 15:59, Panda58dev сказав:

опять же - Вы предлагаете хранить файл на сервере.

Expand  

нет, файл не хранится на сервере, сервер отдает blob

Надіслати
Поділитися на інших сайтах

  В 06.03.2022 в 16:00, spectre сказав:

да на контроллер какой-то, типа common/download

Expand  

Вообще не понял. У меня есть уже контроллер, который отдаёт файл. AJAX-ом он не обрабатывается... 

ocStore 2.3.0.2.4 если что...

Змінено користувачем Panda58dev
Надіслати
Поділитися на інших сайтах


контроллер

$data = 'данные текстового файла';
$json['datafile'] = 'data:text/plain;base64,' . base64_encode($data);
$json['filename'] = 'file.txt';
$this->response->setOutput(json_encode($json));

вьюха

<a href="" id="dataFromFile" style="display: none;" download="">save</a>
...
<script>
  ...
  success: function(json) {
  	$('#dataFromFile').attr('href', json['datafile']).attr('download', json['filename']);
	document.getElementById("dataFromFile").click();    
  }
  ...
</script>

 

  • +1 1
Надіслати
Поділитися на інших сайтах

@Blast угу, то есть, я генерирую ссылку для скачивания и записываю всю строку в url? Сделал почти так же как в Вашем примере, но выполняется .error хотя код ответа 200, разумеется подумал на ошибки PHP, но в журнале ошибок нет, error_get_last() тоже возвращает пустоту. Странное дело. 
Контроллер:

public function getTplFile(){
    if (isset($this->request->post['tpl_name'])) {
        $this->load->model('user/users_perm_plus');

//      $data = $this->model_user_users_perm_plus->getTplPermData($this->request->post['tpl_name']); // (array) $data
//      $data['tpl_name'] = $this->request->post['tpl_name'];

        $data = 'test';

        $file_name = 'upp_tpl_' . $this->request->post['tpl_name'] . '.json';
        $file_data = 'data:text/plain;base64,' . base64_encode($data);

        $json['file_name'] = $file_name;
        $json['file_data'] = $file_data;

        $this->response->addHeader('Content-Type: text/plain');
        $this->response->addHeader('Content-Disposition: attachment; filename="' . $file_name . '"');
        $this->response->setOutput(json_encode($json));
//      $error = error_get_last();
//      $this->response->setOutput($error);
    }
}

AJAX:

function getTplFile(tpl_name) {
    $.ajax({
        url: '<?php echo $link_to_getTplFile; ?>&token=<?php echo $token; ?>',
        method: 'POST',
        dataType: 'text/plain',
        data: {
            tpl_name: tpl_name
        },
        beforeSend: function () {
            $('.panel-title').html('<i class="fa-green fa fa-spinner fa-pulse fa-3x fa-fw"></i><?php echo $text_loading; ?>');
        },
        complete: function () {
            $('.panel-title').html('<i class="fa fa-table"></i>');
        },
        success: function(json) {
            console.log(json);
            $('#tpl-file-link').attr('href', json['file_data']).attr('download', json['file_name']);
            document.getElementById("tpl-file-link").click();
        },
        error: function (error) {
            console.log(error);
        }
    });
}

Ответ сервера:
image.png.05c41616d4e20f80645cd37d7709eb50.png

Змінено користувачем Panda58dev
Надіслати
Поділитися на інших сайтах


Хм, похоже у меня какие то проблемы с dataType. Сейчас везде поставил json но в url почему то там где должно быть содержимое файл стоит [object%20Object]

Вообще сейчас я путаюсь, что куда мне нужно кодировать json в base64 или наоборот. В результате мне нужен json массив в файле...

Змінено користувачем Panda58dev
Надіслати
Поділитися на інших сайтах


Всё, разобрался, нужно было немного с кодировками поколдовать и правильно url сформировать. Всех благодарю, особенно @Blast ! Удачного дня :)

  • +1 1
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.