【问题标题】:Download a file from command line in laravel artisan从 laravel artisan 的命令行下载文件
【发布时间】:2018-12-16 21:29:22
【问题描述】:

我正在使用 laravel Artisan 命令从公共文件夹下载文件。

其实我想下载一个我在公共文件夹中成功制作的 zip 文件。

当我调用按钮单击的方法时,我可以下载文件。

但是当我在控制台中执行命令时它不起作用,也不会抛出任何错误。

public function downloadExportRawData() {
    $a=public_path().'/temp/rawexport/rawexportproduct.zip';
    $path='/temp/rawexport/rawexportproduct.zip';
    if(file_exists('temp/rawexport/rawexportproduct.zip')){
        return Response::download($a);
    }else{
        return "hello";
    }
}

这个也试过了……

public static function downloadZip($rand_folder, $zipname, $fileName) {

    header('Content-Type: application/force-download');
    header('Content-Disposition: attachment; filename="' . $fileName . '.zip"');
    header('Content-Length: ' . filesize($zipname));

    $handle = fopen($zipname, 'rb');
    //exec("rm -r ".$temp);
    while (!feof($handle)) {
        echo fread($handle, 1048576);
        ob_flush();
        flush();
    }
    fclose($handle);
   // exec("rm -r " . $rand_folder);
}

命令是

php artisan product:export --from=http://localhost/valuable-app/dev-master/rest_app/public/ --productid=5b273b0e4bb5995b108b4576 --tokenexport=354c3ddb2bd45aa6e5c4f749749b0b58cbacef48

主要问题是它正在通过控制器中的功能但没有下载它。 我试图回应它以 zip 形式打印代码的响应意味着一种编码形式,它与我的 zip 文件相关,这意味着它打印 zip 而不是下载它。 我是第一次使用 Artisan。知道如何使用用户定义的 Artisan 命令下载该文件。

我从过去两周开始尝试这个,但无法做任何事情。

【问题讨论】:

  • 你要下载到哪里?我想您想将文件保存到另一个位置,因为您正在控制台中运行它。
  • 是在本地系统中,例如在下载文件夹中
  • 也许你应该看看这个article。这是编写自定义工匠命令的一个很好的演练。
  • 您已经向我们展示了您的控制器代码,该代码被设置为进行 浏览器 下载 - 设置内容标题(仅在浏览器中相关),从本地磁盘读取文件(仅与远程服务器上运行的代码相关)等。您向我们询问了一个工匠控制台命令,这是完全不同的东西,但您没有向我们展示任何代码。你的控制台代码在哪里?请记住,正如我所描述的,重用您向我们展示的控制器代码将无法在控制台中工作。
  • 我正在做的是......以 json 格式导出数据并将它们放入一个文件中......然后我将此文件以 zip 格式放入公共文件夹中的 /temp 文件夹中...... . 然后尝试下载该 zip 文件....并在下载后删除该 /temp 文件夹

标签: php laravel file zip


【解决方案1】:

这个怎么样:

首先确定要下载的文件,然后调用

string shell_exec ( string $cmd )

你可以使用 wget 来获取文件。

例如,在您的命令中

    $fileName = $this->argument('filename');
    $file = url('storage/public/' . $fileName);
    shell_exec("wget $file");
    $this->info('downloading');

【讨论】:

  • 但它没有下载。我不知道为什么。当我在终端上直接使用命令时,它正在下载,但是当使用 shell_exec 时它不是
  • 我认为我们可以做到,只是需要更多解释
  • 你离它很近
  • --2018-07-31 11:22:08-- localhost/valuable-app/dev-master/rest_app/public/temp/… 正在解析 localhost (localhost)... 127.0.0.1 正在连接到 localhost (localhost)|127.0.0.1|:80。 .. 连接的。已发送 HTTP 请求,等待响应... 200 OK 长度:26775 (26K) [application/zip] /home/gten/Downloads/rawexportproduct.zip:权限被拒绝 无法写入“/home/gten/Downloads/rawexportproduct.zip” (成功)。
【解决方案2】:

如果您使用控制台,http 下载将不起作用(您没有使用浏览器)。

您可以将文件移动到您希望的目的地或类似的地方,但不能通过控制台下载它

【讨论】:

  • 是的,我已经看到了。但是我将如何移动该文件,然后在下载后我还必须从服务器目录中删除该文件
  • 它的 php artisan 命令也会从服务器下载文件
【解决方案3】:

控制台不会将 http 响应作为下载处理(不会保存) 我认为您应该考虑在控制台中添加第二个参数: --destination=/home/user/downloads/filetosaveas.extension 并在您的代码中使用 curl 下载

或更简单的使用核心卷曲:

curl http://example.com --output my.file --silent

【讨论】:

  • 你能解释一下吗
  • 首先我以为您想通过 http 本地驱动器复制文件,但在这种情况下,它只是将文件从一个文件夹复制到另一个文件夹,不是吗?
【解决方案4】:

如果你真的阅读了 Laravel Docs 网站上的Writing Commands指南,那就太好了,here


简单来说,注册artisan命令主要有两种方式。不管是哪一个是另一个的替代品。

  1. (如路线) 在闭包中指定您的说明。
  2. (类似于控制器) 创建一个命令类并指定您的指令。

关闭方式

在我的routes/console.php 中,我指定如下内容:

Artisan::command('download:file', function () {
    // your code goes here.
})->describe('Download a file.');

现在为您新创建的命令执行帮助例程。

-> php artisan help download:file

Description:
  Donwload a file.

Usage:
    donwload:file

//...

命令方式

使用php artisan make:command EmailFileCommand 生成命令类。此命令将创建app/Console/Commands/EmailFileCommand.php。更新文件以指定我们希望它执行的操作。

// ...
class EmailFileCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'email:file';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Email a file.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // your code goes here.
    }
}

通过 HTTP 触发命令

假设您想通过 http 请求调用命令。在我的routes/web.php 文件中,

//...
use Artisan;

//...

Route::get('/download', function () {
    Artisan::call('download:file');
});

Route::get('/email', function () {
    Artisan::call('email:file');
});

//...

现在执行您的 http 请求 /download/email


要下载文件,可以使用 Laravel 的Filesystem

//...
use Storage;

//...

Storage::download('file.jpg')

这篇文章摘自我的博文here

【讨论】:

  • 我已经成功创建并注册了命令,它执行了所有代码但没有下载。
  • 我已经尝试过文件系统先生。它是通过像控制器这样的 php 脚本下载的,但不是从 Artisan 下载的。
  • @AdeshKumar Storage API 检索~/your-app/storage/ 目录中的文件。您需要确保正在下载的文件存在于相应的目录中。 documentation 清楚地解释了这一点。
  • 也许,你为什么需要一个工匠命令来下载文件?也许有更好的方法来实现你真正想要的。
  • 否则,您需要弄清楚如何将所需文件从所需位置复制/移动到指定位置。
【解决方案5】:

可以使用 shell_exec() 命令通过 PHP 函数或脚本运行终端命令。它将在不打开终端窗口的情况下执行命令。命令的行为会和原来的命令有点不同。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2019-05-23
    • 2016-02-07
    • 1970-01-01
    • 2015-08-29
    • 2016-05-09
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多