Загрузка файла Axios по сгенерированному имени файла из бэкэнда

Я использую Axios для отправки POST запроса на серверную часть.

Серверная часть создает файл Excel с именем например, test.xlsx.

Что я пытаюсь сделать:

Выполнение этого файла с использованием того же имени файла, сгенерированного из бэкэнда, и я попробовал Postman, и все работает нормально.

Что я пробовал:

axios.post(`${env.ENDPOINT}reports/sales/customers_statement`, {
    customers_id: form_data.customers_id,
    from_date: form_data.from_date,
    to_date: form_data.to_date,
  },{
    responseType: 'blob'
  }).then((res) => {
    const url = window.URL.createObjectURL(new Blob([res.data]));
    const link = document.createElement('a');
    const file_name = `${new Date().toISOString().slice(0,10)}.xlsx`; // RENAME HERE
    link.href = url;
    link.setAttribute('download', file_name);
    document.body.appendChild(link);
    link.click();
    resolve(res.data);
  }).catch((e) => {
    reject(e);
  });

Это отлично работает, но не загружает файл по имени файла, сгенерированному с сервера.

Другими словами, я хочу отправить запрос на свой бэкэнд для загрузки файла по имени файла, уже сгенерированному из моего бэкэнда, например, когда я отправляю запрос с помощью Postman.


person Jaad    schedule 26.03.2020    source источник
comment
не могли бы вы предоставить более подробную информацию об ошибке, пожалуйста?   -  person vbuzze    schedule 27.03.2020
comment
Редактирование моего вопроса   -  person Jaad    schedule 27.03.2020
comment
я вижу, вы переименовываете здесь .. это работает? константное имя_файла = ${new Date().toISOString().slice(0,10)}.xlsx   -  person M A Salman    schedule 27.03.2020
comment
@Очень круто. да, это работает, но я не хочу переименовывать во внешнем интерфейсе, потому что я уже называю в бэкэнде   -  person Jaad    schedule 27.03.2020
comment
эй, @jaad, не могли бы вы включить ответ, включая заголовки, в вопрос   -  person M A Salman    schedule 27.03.2020


Ответы (1)


Это связано с тем, что вы устанавливаете для атрибута загрузки значение file_name, которое отличается от возвращаемого сервера имен файлов.

 const file_name = `${new Date().toISOString().slice(0,10)}.xlsx`; 

Попробуйте изменить вышеуказанное на это

const contentDisposition = data.headers['content-disposition'];
const filename = contentDisposition.match(/filename=(?<filename>[^,;]+);/)[0]; 
link.setAttribute('download', file_name);

В бэкенде

response.setHeader("Content-disposition", "attachment; filename="+ yourfilenamehere);
person M A Salman    schedule 26.03.2020