Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


 Погделиться

Рекомендованные сообещёния

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

image.png.58547ccfef2393eb1bc5ade513786f2e.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 в 18:50, spectre сказал:

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

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

Ссылка на комменирий
Погделиться на других сайих


В 06.03.2022 в 17:58, Panda58dev сказал:

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

тогда не акакс

Ссылка на комменирий
Погделиться на других сайих

06.03.2022 в 18:52, stickpro сказал:

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

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

Ссылка на комменирий
Погделиться на других сайих


06.03.2022 в 18:59, spectre сказал:

тогда не акакс

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

Ссылка на комменирий
Погделиться на других сайих


В 06.03.2022 в 18:00, Panda58dev сказал:

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

 

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

Ссылка на комменирий
Погделиться на других сайих

06.03.2022 в 18:59, Panda58dev сказал:

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

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

Ссылка на комменирий
Погделиться на других сайих

06.03.2022 в 19:00, spectre сказал:

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

Вообещё не понял. У меня есть уже контроллер, который отдаёт файл. 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
Ссылка на комменирий
Погделиться на других сайих


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.