laravel中存在的文件在那里不起作用

时间:2018-10-17 12:40:55

标签: php laravel laravel-5.7

在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);

3 个答案:

答案 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接受/\,因此使用/使您的脚本在其他系统上更易于使用,并减少了字符串转义带来的麻烦。