从服务器 Laravel 和 reactjs 下载文件

Posted

技术标签:

【中文标题】从服务器 Laravel 和 reactjs 下载文件【英文标题】:Download file from the server Laravel and reactjs 【发布时间】:2020-01-27 13:44:46 【问题描述】:

大家好,我是 Laravel 和 reactjs 的新手,我有一个问题,我尝试将文件从服务器下载到浏览器。我的请求没问题,但我想要的文件不可读(如果我右键单击浏览器网络-> 预览,我发现符号和字符不可读)也没有下载文件。 我使用 Visual Studio 代码在 Windows 中进行编码。

下载控制器:

public function download()

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

路由/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>
        );
    

【问题讨论】:

尝试在 laravel 中设置正确的标题。见:***.com/a/20415796/592868 【参考方案1】:

您必须熟悉用于 API 消费的 axios 调用,但是如何获取响应文件并将这些文件呈现给用户以供下载。我们得到了您的保障,下面的 sn-p 已经过测试并且运行良好。

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 下载内容。

【讨论】:

【参考方案2】:

尝试在laravel下载函数中设置正确的headers:

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

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

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

【讨论】:

【参考方案3】:

您可以在发送内容之前使用标头和转换。这些行强制浏览器从我的自定义集合或模型中下载 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 =&gt; value

不需要使用 Axios 或 ... 你可以在你的 Laravel 端直接调用你的端点 URL,就像在 React 或纯 JS 中一样。

window.location.href = window.YOUR_API_DOWNLOAD_URL;

【讨论】:

以上是关于从服务器 Laravel 和 reactjs 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ReactJS 组件调用 Laravel Api 路由?

使用 Laravel 托管 ReactJS

将 ReactJS 与 PHP 和 Laravel 一起使用 [关闭]

ReactJS 中的参数路由不显示 UI 组件

部署 Laravel 并在 windows server 中做出反应

在 Laravel 刀片模板中调用 ReactJS 组件