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

Posted

技术标签:

【中文标题】在 Laravel 中处理加密文件(如何下载解密文件)【英文标题】:Working with encrypted files in Laravel (how to download decrypted file) 【发布时间】:2016-04-10 00:16:50 【问题描述】:

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

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

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

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

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

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

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

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

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

我似乎可以做到这一点:

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

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

【问题讨论】:

【参考方案1】:

您可以像这样手动创建响应:

$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 函数还用于从路径中提取文件名,以便发送正确的文件名和响应。

【讨论】:

你是个巫师!谢谢!就我而言,当文件被存储时,它实际上是用 32 位 md5 类型的值命名的,但我确实保留了原始文件名的记录,包括文件扩展名。所以你有pathinfo($fileRecord->file_path, PATHINFO_BASENAME),我只是有$fileRecord->original_name,这似乎也很好用。再次感谢。 不过,作为记录,我的方法在控制台中有一条警告消息(至少在 Chrome 中):Resource interpreted as Document but transferred with MIME type application/octet-stream: 但它仍然可以正常工作。 您可以通过使用 finfo::buffer 从解密的字符串中获取文件的 mime 类型(假设信息已使用内容加密)并将其与响应一起传递来修复该警告。我已经更新了我的答案以包含它。 有没有办法用Laravel media library package做到这一点?【参考方案2】:

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

所以在你的情况下:

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

【讨论】:

以上是关于在 Laravel 中处理加密文件(如何下载解密文件)的主要内容,如果未能解决你的问题,请参考以下文章

施耐德plc程序加密怎么破解

在php5中md5在加密字符串后如何解密

在php5中md5在加密字符串后如何解密

PHP非对称加密

Python简单加密操作

如何使用Base64进行加密和解密