【问题标题】:Laravel 4: File Upload says success not showing in folderLaravel 4:文件上传说成功未显示在文件夹中
【发布时间】:2013-11-03 23:20:06
【问题描述】:

我正在尝试获取要上传的简单图像文件,然后将其移动到指定文件夹,虽然我没有收到错误消息,并且一切都说它可以正常工作,但它不会出现在任何文件夹中。有问题的代码是:

        $destination = public_path().'/auction_img/';
        $filename = $auction->id;

        if (Input::hasFile('image')) {
            $file = Input::file('image');
            try{
            $uploadSuccess = $file->move($destination, $filename.$file->getClientOriginalExtension());
            }catch(Exception $e){
                error_log('Exception: '.$e->getMessage());
            }
            if($uploadSuccess){
                error_log("YAY!");
            }
        }

我没有收到异常,并且我在 error_log 中收到“YAY”。但无论我做什么,它都不会出现。有任何想法吗?我还检查了我的 php.ini,它的最大大小为 20M,但文件只有大约 0.5MB

【问题讨论】:

    标签: file file-upload laravel laravel-4


    【解决方案1】:

    看起来它并没有像你想象的那样发展。

    首先

    try{} catch() {}
    

    不适用于 Laravel。你必须设置一个处理程序:

    App::error(function(Exception $exception)
    {
        Log::error($exception);
    });
    

    然后对你的移动做一个完整的日志,看看它是否真的去你需要的地方:

    $destination = public_path().'/auction_img/';
    $filename = $auction->id;
    
    if (Input::hasFile('image')) {
    
        $file = Input::file('image');
    
        $uploadSuccess = $file->move($destination, "$filename.".$file->getClientOriginalExtension());
    
        if($uploadSuccess) 
        {
            error_log("Destination: $destination");
            error_log("Filename: $filename");
            error_log("Extension: ".$file->getClientOriginalExtension());
            error_log("Original name: ".$file->getClientOriginalName());
            error_log("Real path: ".$file->getRealPath());
        }
        else
        {
            error_log("Error moving file: ".$file->getClientOriginalName());
        }
    }
    

    还要检查原始文件是否在它应该在的位置。

    根据 cmets,你的移动应该是:

    $uploadSuccess = $file->move($destination, "$filename.".$file->getClientOriginalExtension());
    

    检查$destination 是否指向您的公用文件夹,它必须类似于:

    /var/www/site/public/auction_img/
    

    检查public_path() 是否返回/var/www/site/public/,如果不是,您可以使用它来代替它:

    $destination = app()->make('path.public').'/auction_img/'
    

    【讨论】:

    • 真实路径似乎是空的。附:文件未到达应有的位置。
    • $file->getClientOriginalExtension() 是返回 .ext 还是 ext
    • 只是 ext 或者因为它是一个 png 文件,所以只是 png
    • 那么,你错过了$filename.$file->getClientOriginalExtension()中的.,我觉得应该是$filename. '.' .$file->getClientOriginalExtension()
    • 另外,如果目标文件夹没有写权限,$file->move(...) 将返回什么,如果它返回 false 那么没关系,但如果它静默失败,那么你应该检查权限,没有尝试文件上传Laravel-4.
    【解决方案2】:

    至少在 Laravel 4.0 中,$uploadSuccess 不是布尔值。它在文件对象被移动后返回它(它返回$file,所以它可以被链接起来)。该对象不能可靠地转换为布尔值(如果我尝试像您一样在 if 语句中使用它,Symfony 会为我引发异常)。

    如果文件移动失败,则会引发异常。如果引发异常,那么您就知道该文件没有被移动并保持在原来的位置。这样,$file 就成为了一个有效的 Symfony 文件对象,所以你的处理将继续它第一次登陆的文件。

    所以无论文件是否成功移动,您的“YAY!”始终在执行路径中。如果移动失败,您将捕获异常,记录它,然后无法对异常采取任何进一步的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2021-03-18
      • 2013-08-11
      • 2015-04-21
      • 2013-07-22
      • 2013-04-06
      • 2015-03-21
      相关资源
      最近更新 更多