从Laravel Artisan的命令行下载文件

时间:2018-07-09 08:48:32

标签: php laravel file zip

我正在使用laravel Artisan Commands从公用文件夹下载文件。

实际上我想下载一个在公共文件夹中成功制作的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命令下载该文件。

最近两周我一直在尝试此操作,但无能为力。

5 个答案:

答案 0 :(得分:2)

如何?

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

string shell_exec ( string $cmd )

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

例如,在您的命令中

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

答案 1 :(得分:1)

如果您使用控制台,则无法使用http下载(您未使用浏览器)。

相反,您可以将文件移动到所需的目的地或类似的位置,但不能通过控制台下载

答案 2 :(得分:1)

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

或更简单地使用核心curl:

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

答案 3 :(得分:1)

如果您确实通过了Laravel Docs网站here上做得很好的 Writing Commands 指南,就很好了。


简而言之,注册工匠命令主要有两种方法。一个可以替代另一个。

  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

答案 4 :(得分:0)

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