【问题标题】:Working with encrypted files in Laravel (how to download decrypted file)在 Laravel 中处理加密文件(如何下载解密文件)
【发布时间】: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);

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多