2015-04-16 92 views
0

有這麼多類似的問題,但沒有一個看起來完全一樣。Laravel/php上傳不起作用

下面是一些代碼,我使用的內外牆

public function create($input, $index = false, $params = false) 
{ 
    $file = Input::file($input); 

    if ($file === null) 
    { 
     return false; 
    } 

    if ($index !== false) 
    { 
     $file = $file[$index]; 
    } 
    else 
    { 
     $file = reset($file); 
    } 

    if ($file === null) 
    { 
     return false; 
    } 

    $image    = new ImageModel; 
    $image->mime  = $file->getClientMimeType(); 
    $image->extension = $file->guessClientExtension(); 
    $image->filename = $file->getClientOriginalName(); 

    if ($params !== false) 
    { 
     //there are parameters to add 
    } 
    $image->save(); 
    $image->hash = md5($image->id); 

    $path = str_split($image->hash); 
    $path = array_slice($path, 0, 5); 

    $system_path = implode(DIRECTORY_SEPARATOR, $path); 

    $fileName = substr($image->hash, 5); 
    $path[] = $fileName; 

    $image->path = implode('/', $path); 
    $destination_path = implode(DIRECTORY_SEPARATOR, [public_path(), 'images', $system_path, null]); 

    if (self::_makePath($destination_path)) 
    { 
     $file_path = implode('.', [$destination_path.$fileName, $image->extension]); 
     $image->save(); 
     dd([ 
      $file->getRealPath(), 
      file_exists($file->getRealPath()), 
      file_exists($destination_path), 
      $file_path, 
      is_writable($destination_path), 
      move_uploaded_file($file->getRealPath(), $file_path) 
     ]); 
     move_uploaded_file($file->getRealPath(), $file_path); 
     //$file->move($destination_path, $fileName); 

     $this->image = $image; 

     return $this->image; 
    } 

    return false; 
} 

該功能的目的是創建圖片ID的散列,然後用它來創建到圖像的目錄路徑,確保上傳將始終是唯一的。

這個功能在$file->move最近在一個家園應用程序(laravel 4.2,而不是最新版本的homestead,也在一定程度上進行了調整,但沒有任何php/nginx值被改變),但是沒有任何調整一段時間後,它停止工作。我試圖改變功能,以交替方式做上傳,但沒有。它說的是該文件無法上傳,原因不明。

使用上面的代碼我有一些測試,如果文件可以上傳/移動並且全部檢出,即使move_uploaded_file返回true,但是沒有文件被移動。

+0

如果不仔細觀察代碼,您是否檢查過目標目錄的權限? – lukasgeiter

+0

是的,我正在使用'is_writable'來檢查使用轉儲。 –

回答

0

找出問題所在,雖然在我看來這是一個錯誤,但卻很難追查到。

上傳基本上運行了兩次,它正在工作,但因爲最新的圖像是第二個,所以它看起來並不像。使用laravel很難看到這個,除非你看到2行添加到數據庫中,但是如果你沒有將它們存儲在數據庫中,那麼這個選項就不存在了。

運行兩次的代碼是對Facade的調用,所以上面的代碼沒有列出它。