Laravel 4:文件上传表示成功未显示在文件夹中

时间:2013-10-25 01:37:25

标签: file file-upload laravel laravel-4

我正在尝试上传一个简单的图像文件,然后将其移动到指定的文件夹,虽然我没有收到任何错误消息,但一切都说它有效,但它不会显示在任何文件夹中。有问题的代码是:

        $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

2 个答案:

答案 0 :(得分:3)

看起来它不会发生在你认为它会发生的地方。

首先

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());
    }
}

同时检查原始文件是否应该在原来的位置。

根据评论,你的行动应该是:

$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/'

答案 1 :(得分:0)

至少在Laravel 4.0中

$ uploadSuccess,不是布尔值。它在移动后返回文件对象(它返回$ file,因此可以链接)。这个对象不能可靠地转换为布尔值(如果我尝试在if语句中使用它,Symfony会为我引发异常)。

如果文件移动失败,则会引发异常。如果引发异常,则表示文件尚未移动并保持原样。因此,将$ file作为有效的Symfony文件对象,因此您的处理将继续使用它首次登陆的文件。

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