Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


Recommended Posts

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

image.png.58547ccfef2393eb1bc5ade513786f2e.png

 

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

Link to comment
Share on other sites


через 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
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites


Posted (edited)
06.03.2022 в 19:00, spectre сказал:

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

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

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

Edited by Panda58dev
Link to comment
Share on other sites


контроллер

$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
Link to comment
Share on other sites

Posted (edited)

@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

Edited by Panda58dev
Link to comment
Share on other sites


Posted (edited)

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

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

Edited by Panda58dev
Link to comment
Share on other sites


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

  • +1 1
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.