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

时间:2016-01-06 01:16:14

标签: php laravel encryption file-upload laravel-5

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

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

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

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

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

  • ID
  • FILE_PATH
  • file_name中
  • original_name(包括扩展名)

现在我希望用户能够下载此加密文件。但是,我无法解密文件并将其返回给用户。在Laravel文档的file downloads response section中,它建议这样做:

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

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

我似乎能够做到这一点:

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

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

2 个答案:

答案 0 :(得分: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) . '"'
));

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

答案 1 :(得分:1)

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

所以在您的情况下:

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