Скачайте файл с сервера Laravel и реагировать - PullRequest
0 голосов
/ 27 сентября 2019

Привет всем, я новичок в Laravel и реагировать, и у меня есть вопрос, я пытаюсь загрузить файл с сервера в браузер.Мой запрос в порядке, но файл, который я хотел, не читается (если я щелкну правой кнопкой мыши в браузере Network-> Preview, я найду символы и символы, которые невозможно прочитать), и файл не будет загружен.Я использовал код Visual Studio для кодирования в Windows.

DownloadController:

public function download()
{
    $file = public_path()."/file.pdf";
    return response()->download($file);
}

routs / api.php:

Route::get('download','Api\DownloadController@download');

В файле Js:

import React, { Component } from 'react';
import axios from 'axios';

export default class download extends Component{

    constructor () {
        super();
    }

    componentDidMount() {
            axios.get(`http://127.0.0.1:8000/api/download`)
                .then((response) => {
                    console.log('hello');
                });
    }

    render() {
        return (
            <div>
                <button onClick={this.componentDidMount.bind(this)} className="btn btn-primary">Download</button>
            </div>
        );
    }
}

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

попробуйте установить правильные заголовки в функции загрузки laravel:

$headers = [
    'Content-Type' => 'application/pdf',
];

return response()->download($file, 'filename.pdf', $headers);

[1] https://stackoverflow.com/a/20415796/592868

0 голосов
/ 27 сентября 2019

Вы можете использовать заголовок, а также преобразование перед отправкой содержимого.Эти строки заставляют браузер загружать файл XML из моей пользовательской коллекции или модели.

$response = Response::create(strval($someCollection), 200);
$response->header('Content-Type', 'text/xml');
$response->header('Cache-Control', 'public');
$response->header('Content-Description', 'File Transfer');
$response->header('Content-Disposition', 'attachment; filename=custome_filename.xml');
$response->header('Content-Transfer-Encoding', 'binary');
return $response;

Если ваш файл готов, вам не нужно читать его содержимое, поэтому вы можете использовать его:

return response()->download($pathToFile, $name, $headers);

И $headers может быть массивом из приведенного выше примера, например:

$header = ['Content-Type' => 'text/xml'];

с дополнительными настройками key => value

Нет необходимости использовать Axios или ... Вы можетепозвоните напрямую по URL вашей конечной точки на вашей стороне Laravel, например, в React или чистом JS.

window.location.href = window.YOUR_API_DOWNLOAD_URL;
0 голосов
/ 27 сентября 2019

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

axios({
  url: 'http://api.dev/file-download',
  method: 'GET',
  responseType: 'blob', // important
}).then((response) => {
   const url = window.URL.createObjectURL(new Blob([response.data]));
   const link = document.createElement('a');
   link.href = url;
   link.setAttribute('download', 'file.pdf'); //or any other extension
   document.body.appendChild(link);
   link.click();
});

Кредиты этому Javilobo для его полезного Solution .

Вы можете проверить https://github.com/kennethjiang/js-file-download/blob/master/file-download.js, чтобы увидеть, как обрабатывать IE для загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...