我正在使用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命令下载该文件。
最近两周我一直在尝试此操作,但无能为力。
答案 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 指南,就很好了。
在我的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请求调用命令。在我的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函数或脚本运行终端命令。它将在不打开终端窗口的情况下执行命令。命令的行为将与原始命令有所不同。