0

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

        $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

4

2 回答 2

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/'
于 2013-10-25T02:03:25.040 回答
0

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

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

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

于 2014-01-29T15:38:19.373 回答