上传图片时未能打开流错误

时间:2016-03-08 05:52:27

标签: php laravel file-upload

我有文件夹结构年/月/日。我需要在年/月/日的目录中上传图片,例如2016/03/08 / example.jpg。

这是我的代码

 public function UpdateImage(Request $request){

        $year = date("Y");
        $year = public_path().'/upload/userimage/'.$year;

        if(!file_exists ($year)){
            $month = date("m");
            $month = $year."/".$month;
            if(!file_exists ($year)){
                mkdir($month, 0777, true);
                chmod($year, 0777);
                chmod($month, 0777);
            }

            $day = date("d");
            $day = public_path().'/upload/userimage/'.date("Y")."/".date("m")."/".date("d");

            if(!file_exists ($day)){
                mkdir($day, 0777, true);
                chmod($day, 0777);
            }
        }else{
            $month = date("m");
            $month = public_path().'/upload/userimage/'.date("Y")."/".date("m");
            if(!file_exists ($month)){
                mkdir($month, 0777, true);
                chmod($year, 0777);
                chmod($month, 0777);
            }

            $day = date("d");
            $day = public_path().'/upload/userimage/'.date("Y")."/".date("m")."/".date("d");

            if(!file_exists ($day)){
                mkdir($day, 0777, true);
                chmod($day, 0777);
            }
        }
        $url = public_path().'/upload/userimage/'.date("Y")."/".date("m")."/".date("d");

        $data = $_POST['imageData'];
        $userIdx = $_POST['id'];
        $delImage = DB::table('user')->where('UserIdx', $userIdx)->first();
        $filename = $url.$delImage->PhotoFilePathName;

        if(file_exists($filename)){
            //unlink($filename);
        }

        $imageName =  date("Y")."/".date("m")."/".date("d")."/".hash('ripemd160', time()).'.png';

        DB::table('user')
            ->where('UserIdx', $userIdx)
            ->update(array('PhotoFilePathName' => $imageName));

        list($type, $data) = explode(';', $data);
        list(, $data)      = explode(',', $data);
        $data = base64_decode($data);
        file_put_contents($url, $data);

    }

但是上传图片时收到此错误。

file_put_contents(/var/www/html/sitename/public/upload/userimage/2016/03/08): failed to open stream: Is a directory.

请帮助解决此问题并查看我的代码。

1 个答案:

答案 0 :(得分:1)

问题是你给了file_put_contents的文件夹路径,你可以通过给它文件路径来解决这个问题。但是还有其他一些方面你可以改进你的功能,例如文件夹创建过程,你提供给mkdir的第三个参数是用于创建递归文件夹,如果你不需要分别创建年/月/日目录用那个标志。尝试以下代码,它将解决您的功能问题:

    public function UpdateImage(Request $request){
        $folderPath = '';

        $year = date('Y');
        $month = date('m');
        $day = date('d');

        $folderPath = $year . "/" . $month . "/" . $day;

        $baseUrl = public_path().'/upload/userimage/';
        if(!file_exists ($baseUrl . $folderPath)) {
            mkdir($baseUrl . $folderPath, 0777, true);
            chmod($baseUrl . $year, 0777);
            chmod($baseUrl . $month, 0777);
            chmod($baseUrl . $day, 0777);
        }

        $data = $_POST['imageData'];
        $userIdx = $_POST['id'];
        $delImage = DB::table('user')->where('UserIdx', $userIdx)->first();
        $filename = $baseUrl.$delImage->PhotoFilePathName;

        if(file_exists($filename)){
            //unlink($filename);
        }

        $imageName =  $folderPath . "/" . hash('ripemd160', time()).'.png';

        DB::table('user')
            ->where('UserIdx', $userIdx)
            ->update(array('PhotoFilePathName' => $imageName));

        list($type, $data) = explode(';', $data);
        list(, $data)      = explode(',', $data);
        $data = base64_decode($data);
        file_put_contents($baseUrl . $imageName, $data);
    }