首页 > 解决方案 > 如何从 sql 数据库中的单个单元格下载多个文件?我正在使用 laravel 5.5

问题描述

我有一个包含员工详细信息的用户行,并且 $image 有多个文件存储在数据库中。我想下载每个文件。到目前为止,我只能下载存储在 $image 中的单个文件

这是myview.blade.php

<input type="file" name="image[]" class="form-control" value="{{ $employee['image'] }}" multiple>
 <a href="{{ url('/people/employees/download/' . $employee['image']) }}">{{$employee['image']}}</a>

我的route.php

Route::get('/people/employees/upload/{id}', 'EmplController@upload');
Route::get('/people/employees/download/{image}', 'EmplController@download');

我的controller.php

public function test(Request $request, $id) {
    
    $employee = User::find($id);

    if($request->hasfile('image')){
        $files = [];
        foreach ($request->image as $image) {
            $path = $image->getClientOriginalName();
            $filename = time() . '-' . $path;
            $files[] = $filename;
            $image->storeAs('employees', $employee->id . '/' . $filename);
            $image->move(public_path('employees'),$filename);
        }

        $files = explode(",", $files[0]);
    }

    $employee->image = $employee->image  .  $files[0];
    $employee->save();  
}

public function download($image){
    $employee = User::find($image);
    $filename = $image;
    $filepath = public_path('employees/' . $filename);

    return response()->download($filepath);
}

当我在上传多个文件时执行 print_r 函数时,它会选择一个文件?

Array ( [0] => 1596838646-logo.jpg )

我想下载 myview.blade 上显示的多个文件。

标签: phpsqllaravelexplode

解决方案


正如上面的子操作所说,这是不可能的,因为 HTTP 不支持多个文件下载。解决方案之一是打开每个文件的连接以下载,但在我看来,更优雅的是文件压缩,它包含所有文件。

PHP为此提供了解决方案,它是ZipArchive

之后,您压缩所有文件,在 tmp 目录中写入磁盘,并使用您的文件位置发送流响应。php 关闭连接后,您可以使用Laravel Terminate Middleware/Callback并删除该存档以刷新磁盘上的空间。

简单的 PHP 示例取自上面的链接。

$files = array('image.jpeg','text.txt','music.wav');
$zipname = 'enter_any_name_for_the_zipped_file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
}
$zip->close();

///Then download the zipped file.
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

推荐阅读