在 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】:Laravel 5.6 允许您使用流进行下载:https://laravel.com/docs/5.6/responses#file-downloads
所以在你的情况下:
return $response()->streamDownload(function() use $decryptedContents
echo $decryptedContents;
, $fileName);
【讨论】:
【参考方案2】:您可以像这样手动创建响应:
$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做到这一点?以上是关于在 Laravel 中处理加密文件(如何下载解密文件)的主要内容,如果未能解决你的问题,请参考以下文章