使用Laravel中的加密文件(如何下载解密文件)

Mar*_*cel 5 php encryption file-upload laravel laravel-5

在我的webapp中,用户可以上传文件.在保存和存储之前,文件的内容使用以下内容加密:

Crypt::encrypt(file_get_contents($file->getRealPath()));
Run Code Online (Sandbox Code Playgroud)

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

Storage::put($filePath, $encryptedFile);
Run Code Online (Sandbox Code Playgroud)

我有一个表来存储有关每个文件的信息,例如:

  • ID
  • 文件路径
  • 文件名
  • original_name(包括扩展名)

现在我希望用户能够下载此加密文件.但是,我无法解密文件并将其返回给用户.在Laravel文档的文件下载响应部分中,它建议执行此操作:

return response()->download($pathToFile, $name, $headers);
Run Code Online (Sandbox Code Playgroud)

它想要一个很好的文件路径,但是在哪一点上我可以解密文件内容以便它实际上是可读的?

我似乎能做到这一点:

$encryptedContents = Storage::get($fileRecord->file_path);
$decryptedContents = Crypt::decrypt($encryptedContents);
Run Code Online (Sandbox Code Playgroud)

...但我不知道如何将其作为具有指定文件名的下载返回.

Bog*_*dan 12

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

$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) . '"'
));
Run Code Online (Sandbox Code Playgroud)

您可以查看Laravel API以获取有关该make方法参数的更多信息.该pathinfo函数还用于从路径中提取文件名,以便它使用响应发送正确的文件名.