我正在尝试上传一个简单的图像文件,然后将其移动到指定的文件夹,虽然我没有收到任何错误消息,但一切都说它有效,但它不会显示在任何文件夹中。有问题的代码是:
$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
答案 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)
$ uploadSuccess,不是布尔值。它在移动后返回文件对象(它返回$ file,因此可以链接)。这个对象不能可靠地转换为布尔值(如果我尝试在if语句中使用它,Symfony会为我引发异常)。
如果文件移动失败,则会引发异常。如果引发异常,则表示文件尚未移动并保持原样。因此,将$ file作为有效的Symfony文件对象,因此您的处理将继续使用它首次登陆的文件。
因此,无论文件是否成功移动,您的“YAY!”总是在执行路径中。如果移动失败,则捕获异常,记录它,然后无法对异常采取任何进一步操作。