在laravel项目中,我有一个用于上载文件并将其删除的表格。 我在config / filesystem中创建了一个磁盘:
@WithMockUser(username = "john", roles={"ADMIN"})
public class UsersAdminSecurityTest {
}
这里上传的文件工作正常,但是当我要从公用文件夹中删除文件时,该文件不存在:
'upload' => [
'driver' => 'local',
'root' => public_path(),
'url' => env('APP_URL'),
'visibility' => 'public',
],
为什么这个文件不存在,哪个删除文件是正确的?
用路线操作会变得更加复杂?
$img_path = public_path( $this->directory . '/' . $this->getFliename());
$img_path = str_replace( "/",'\\', $img_path); // checked with it & without it
// $img_path= "C:\Users\Me\Desktop\final\public\upload\users\1\5bc722d2b7c05.jpg"
dump(File::exists($img_path)); // it always return false
// and then which one
File::delete($img_path);
Storage::disk('upload')->delete($img_path);
答案 0 :(得分:0)
当您将图像存储在public / upload文件夹中时:
$user_id= $user->id;
$file_name=$user->image;
$img_path=public_path('upload/users/'.$user_id. '/' .$filename);
if(is_file($img_path)){
unlink($img_path);
// or File::delete($img_path);
}else{
echo "File does not exist";
}
答案 1 :(得分:0)
文件可能存在于文件系统上,但是运行PHP的Web用户可能没有读取,更新或删除文件的权限。
在Linux或Mac系统上,通常需要授予Web用户文件的所有权,并将文件权限设置为664,将文件夹权限设置为775。
644和755也应该起作用,并为您提供更严格的权限。
如果以上操作均失败,请尝试进行777调试,但不要在生产环境中这样做,因为这是一个严重的安全问题。
我不确定在Windows上如何完成此操作,但希望这能使您走上正确的道路。
答案 2 :(得分:0)
您的$ img_path似乎设置了文件的完整路径,而不是保存文件时$file->storeAs()
返回的相对于指定磁盘基础的路径。
这应该有效:
Storage::disk('upload')->delete('upload/users/1/5bc722d2b7c05.jpg')
如果由于某种原因需要磁盘上的完整路径,请尝试以下操作:
Storage::disk('upload')->path('upload/users/1/5bc722d2b7c05.jpg')
检查文件是否存在:
Storage::disk('upload)->exists('upload/users/1/5bc722d2b7c05.jpg')
或File::exists(Storage::disk('upload')->path('upload/users/1/5bc722d2b7c05.jpg'))
(返回C:\Users\Me\Desktop\final\public\upload/users/1/5bc722d2b7c05.jpg
,因为您的“上载”磁盘的基数为public_path()
)
Web服务器的读/写权限也可能会发挥作用,具体取决于您的服务器配置。通常,您不会将内容直接存储在public/
文件夹中,而是存储在storage/app/public
中,并使用php artisan storage:link
生成指向存储目录的符号链接。您可以在此处了解更多信息:https://laravel.com/docs/5.7/filesystem#the-public-disk
作为旁注,Windows接受/
或\
,因此使用/
使您的脚本在其他系统上更易于使用,并减少了字符串转义带来的麻烦。