代码之家  ›  专栏  ›  技术社区  ›  Marcel Gruber

在Laravel中处理加密文件(如何下载解密文件)

  •  6
  • Marcel Gruber  · 技术社区  · 9 年前

    在我的网络应用程序中,用户可以上传文件。在保存和存储之前,文件的内容使用如下方式进行加密:

    Crypt::encrypt(file_get_contents($file->getRealPath()));
    

    然后我使用Laravel附带的文件系统来移动文件

    Storage::put($filePath, $encryptedFile);
    

    我有一个表来存储每个文件的信息,其中包含以下列:

    • 身份证件
    • 文件路径(_P)
    • 文件名
    • original_name(包括扩展名)

    现在我希望用户能够下载这个加密文件。然而,我在解密文件并将其返回给用户时遇到了问题。在 file downloads response section 在Laravel文档中,它建议这样做:

    return response()->download($pathToFile, $name, $headers);
    

    它需要一个很好的文件路径,但在什么时候我可以解密文件内容,使其真正可读?

    我似乎能够做到这一点:

    $encryptedContents = Storage::get($fileRecord->file_path);
    $decryptedContents = Crypt::decrypt($encryptedContents);
    

    …但我不知道如何以指定文件名将其作为下载返回。

    2 回复  |  直到 9 年前
        1
  •  13
  •   Bogdan    9 年前

    您可以手动创建响应,如下所示:

    $encryptedContents = Storage::get($fileRecord->file_path);
    $decryptedContents = Crypt::decrypt($encryptedContents);
    
    return response()->make($decryptedContents, 200, array(
        'Content-Type' => (new finfo(FILEINFO_MIME))->buffer($decryptedContents),
        'Content-Disposition' => 'attachment; filename="' . pathinfo($fileRecord->file_path, PATHINFO_BASENAME) . '"'
    ));
    

    您可以查看 Laravel API 有关 make 方法是。这个 pathinfo 函数还用于从路径中提取文件名,以便在响应中发送正确的文件名。

        2
  •  3
  •   gX.    6 年前

    Laravel 5.6允许您使用流进行下载: https://laravel.com/docs/5.6/responses#file-downloads

    因此,在您的案例中:

    return $response()->streamDownload(function() use $decryptedContents {
        echo $decryptedContents;
    }, $fileName);