2013-09-27 229 views
22

Tôi có Biểu mẫu trong số các thông tin khác, người dùng sẽ tải lên hình ảnh. Tôi muốn lưu trữ đường dẫn đến hình ảnh trên cơ sở dữ liệu và lưu hình ảnh vào thư mục public/img/ trên Máy chủ.Laravel 4 - Tải lên tệp

Biểu mẫu đã được mở bằng cách sử dụng: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }} để có thể POST tệp. Kiểm tra HTML Tôi có folowing:

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

Tôi có thể POST lên Bộ điều khiển và nhận tất cả dữ liệu từ Biểu mẫu như mong đợi. Phương pháp xử lý các tập tin như sau:

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 
} 

Khi tôi chọn một tập tin và gửi biểu mẫu, tất cả mọi thứ dường như làm việc, ngoại trừ việc không có tập tin sẽ được lưu vào thư mục /img. Cơ sở dữ liệu đăng ký đường dẫn tệp và tên chính xác.

Chạy dd($uploadSuccess); ngay sau khối if { ...}, tôi nhận được như sau:

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" } 

Tôi đang làm gì sai?

+3

Ngoài các câu trả lời từ [Reflic], nó sẽ là cần thiết để điều chỉnh 'path' trên cơ sở dữ liệu như sau: '' con đường '=>' img/'. $ filename]); ' –

+0

Đúng vậy, tôi đã quên điều này. – Reflic

Trả lời

33

$ destination_path của bạn sai. Bạn cần phải bao gồm đường dẫn đến thư mục/công cộng ở điểm đến $ biến của bạn như thế này:

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

3

Vì bạn dường như đang sử dụng php 5.4 bạn cũng có thể xem xét sử dụng Stapler. Nó khá ổn định ngay bây giờ (sẽ được ra khỏi bản beta rất ngắn) và sẽ giúp bạn tiết kiệm từ rất nhiều các boilerplate mà bạn đang phải viết ngay bây giờ.

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

câu trả lời được đưa ra bởi @Reflic thể br đúng ... nhưng không phải cho tôi ....
con đường này làm việc cho tôi.
có thể do tôi đã xóa "công khai /" khỏi url ... cảm ơn bạn.

1

tôi có cùng một vấn đề. Tôi có mọi thứ đúng về mã của tôi ngoại trừ

public_path() 

Chẳng phải thêm vào trước vào thư mục của tôi

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

Tôi cũng đã làm điều này để thay đổi tên tập tin của tôi

tôi có phần mở rộng tập tin

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

Và đó là tên tệp đã thay đổi. Laravel thực sự tuyệt vời

1

bạn cũng có thể viết đường dẫn tương đối. như là

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

hoặc

$destinationPath= 'public/img/';