2013-09-27 91 views
22

我有一個表單,其中包括其他信息,用戶可以上傳圖像。我想將路徑存儲在數據庫中的圖像上,並將圖像保存到服務器上的public/img/文件夾中。 {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }},以便它能夠將文件發佈:Laravel 4 - 文件上傳

的形式使用打開。檢查HTML我有以下內容:

<form method="POST" action="http://mypizza/pizzas" 
    accept-charset="UTF-8" enctype="multipart/form-data"> 

我可以POST到我的控制器並從窗體接收所有數據按預期。處理文件的方法如下:

public function store() { 
    //TODO - Validation 

    $destinationPath = ''; 
    $filename  = ''; 

    if (Input::hasFile('image')) { 
     $file   = Input::file('image'); 
     $destinationPath = '/img/'; 
     $filename  = str_random(6) . '_' . $file->getClientOriginalName(); 
     $uploadSuccess = $file->move($destinationPath, $filename); 
    } 


    $pizza = Pizza::create(['name'  => Input::get('name'), 
          'price'  => Input::get('price'), 
          'ingredients' => Input::get('ingredients'), 
          'active'  => Input::get('active'), 
          'path'  => $destinationPath . $filename]); 

    if ($pizza) { 
     return Redirect::route('pizzas.show', $pizza->id); 
    } 

    //TODO - else 
} 

當我選擇一個文件並提交表單,一切似乎工作,但沒有文件被保存在文件夾/img。數據庫正確註冊文件路徑和名稱。在if { ...}塊之後

運行dd($uploadSuccess);正確的,我得到如下:

object(Symfony\Component\HttpFoundation\File\File)#220 (2) { 
    ["pathName":"SplFileInfo":private]=> string(17) "/img\YZmLw7_2.jpg" 
    ["fileName":"SplFileInfo":private]=> string(12) "YZmLw7_2.jpg" } 

我在做什麼錯?

+3

除了從[Reflic]答案,則有必要調整數據庫上的'path'如下:''路徑'=>'img /'。 $ filename]);' –

+0

那是正確的,我已經忘記了這一點。 – Reflic

回答

33

$ destination_path可是錯誤的。您必須在您的變量$目的地像這樣的路徑/ public目錄:

$destinationPath = public_path().'/img/';

3

既然你似乎是使用PHP 5.4,你也可以考慮使用Stapler。它現在非常穩定(很快就會超出測試版),並且可以爲您節省大量現在不得不編寫的樣板文件。通過@Reflic給出

1
$destinationPath= public_path() . 'img/'; 

答案可能BR權......但不適合我....
這條道路爲我工作。
它可能是因爲我從url中刪除「public /」... 謝謝。

1

我有同樣的問題。我把一切都說得對,我的代碼除了

public_path() 

沒有預先考慮到我的文件夾

$destinationPath= public_path() . '/img/'; // Worked perfect 

我也這樣做是爲了改變我的文件名

我得到的文件擴展名

$extension = Input::file('YourFileName')->getClientOriginalExtension(); 
$filename = WhateverYouWantHere . '.' . $extension; 

,就是這樣,文件名更改。 Laravel確實很棒

1

你也可以寫相對路徑。 等作爲

$destinationPath="resources/assets/images/";

$destinationPath= 'public/img/';