Laravel新手实现上传文件加密遇报错:调用getClientOriginalExtension异常
解决Laravel文件加密上传时的
getClientOriginalExtension()调用错误 嘿,我帮你排查下这个加密文件上传的问题~你遇到的错误根源很明确:你在加密后的内容(字符串/数组)上调用了只有上传文件实例才有的getClientOriginalExtension()方法,这当然会报错啦。
错误原因拆解
$user_store_pic是Illuminate\Http\UploadedFile类的实例,只有它能调用getClientOriginalExtension()获取原文件扩展名。但你执行encrypt($fileContent)后,得到的$encryptedContent是一串加密后的字符串,已经和原文件对象没关系了,自然无法调用文件对象的方法。你尝试转成数组也没用,数组同样没有这个方法。
修正后的代码方案
我们只需要调整操作顺序:先通过原文件对象获取扩展名、生成文件名,再处理文件加密和上传。完整代码如下:
if ($file != null && !empty($file)) { $userfile = DNEUser::find($lastUserId); $user_store_pic = $request->file('user_store_pic'); // 1. 先从原文件对象获取扩展名(这一步必须提前!) $originalExtension = $user_store_pic->getClientOriginalExtension(); // 2. 生成文件名,用用户ID+时间戳+原扩展名 $user_store_pic_name = $lastUserId . '_' . time() . '.' . $originalExtension; $filePath = 'store/' . $user_store_pic_name; // 3. 获取文件内容并加密 $fileContent = $user_store_pic->get(); $encryptedContent = encrypt($fileContent); // 4. 上传加密后的内容到S3,直接传入加密字符串即可 $s3 = \Storage::disk('uploads'); $s3->put($filePath, $encryptedContent); // 5. 保存文件路径到数据库 $userfile->user_store_pic = $filePath; $userfile->save(); }
额外提示:解密下载
如果后续需要解密下载这个文件,记得从S3取出加密内容后用decrypt()解密,再返回响应:
// 从数据库取出文件路径 $filePath = DNEUser::find($userId)->user_store_pic; // 获取加密内容 $encryptedContent = \Storage::disk('uploads')->get($filePath); // 解密 $decryptedContent = decrypt($encryptedContent); // 返回下载响应,这里可以根据原文件类型设置Content-Type return response($decryptedContent) ->header('Content-Type', $user_store_pic->getClientMimeType()) ->header('Content-Disposition', 'attachment; filename="your-filename.'.$originalExtension.'"');
内容的提问来源于stack exchange,提问作者Sagar Parikh
相关产品推荐
相关产品推荐

