在我的网络应用中,用户可以上传文件。在保存和存储之前,文件的内容使用以下内容加密:
Crypt::encrypt(file_get_contents($file->getRealPath()));
然后我使用Laravel附带的文件系统来移动文件
Storage::put($filePath, $encryptedFile);
我有一个表来存储有关每个文件的信息,例如:
现在我希望用户能够下载此加密文件。但是,我无法解密文件并将其返回给用户。在Laravel文档的file downloads response section中,它建议这样做:
return response()->download($pathToFile, $name, $headers);
它想要一个很好的文件路径,但是在哪一点上我可以解密文件内容以使其实际可读?
我似乎能够做到这一点:
$encryptedContents = Storage::get($fileRecord->file_path);
$decryptedContents = Crypt::decrypt($encryptedContents);
...但我不知道如何将其作为具有指定文件名的下载返回。
答案 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);