2013-09-27 12 views
22

मेरे पास एक फॉर्म है जहां अन्य जानकारी के बीच, कोई उपयोगकर्ता एक छवि अपलोड करेगा। मैं डेटाबेस पर छवि के पथ को संग्रहीत करना चाहता हूं और छवि को सर्वर पर public/img/ फ़ोल्डर में सहेजना चाहता हूं।लार्वेल 4 - फ़ाइल अपलोड करें

फ़ॉर्म का उपयोग करके खोला गया था: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }} ताकि यह फाइल पोस्ट करने में सक्षम हो।

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

मैं अपने नियंत्रक को पोस्ट और अपेक्षा के अनुरूप फार्म से सभी डेटा प्राप्त कर सकते हैं: HTML मैं folowing है निरीक्षण। विधि फ़ाइल से निपटने के इस प्रकार है:

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 गलत है। आप इस तरह अपने चर $ गंतव्य में/सार्वजनिक निर्देशिका के लिए पथ शामिल करने के लिए है:

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

3

जब से तुम php 5.4 का उपयोग करने की आप भी Stapler विचार कर सकते हैं दिखाई देते हैं। यह अब काफी स्थिर है (बहुत जल्द बीटा से बाहर होगा) और आपको उस बॉयलरप्लेट से बचाएगा जिसे आप अभी लिखना चाहते हैं।

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

जवाब @Reflic द्वारा दिए गए अधिकार br सकता है ... लेकिन मेरे लिए नहीं ....
इस पथ मेरे लिए काम किया।
ऐसा इसलिए हो सकता है क्योंकि मैंने url से "public /" को हटा दिया है ... धन्यवाद।

1

मुझे एक ही समस्या थी। मैं

public_path() 

के अलावा मेरी फ़ोल्डर

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

मैं भी ऐसा किया मेरी फाइल नाम बदलने के लिए

को prepending नहीं था मैं फाइल एक्सटेंशन मिल गया सब कुछ मेरी कोड के बारे में अधिकार मिल गया

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

और यही वह है, फ़ाइल का नाम बदल गया। Laravel वास्तव में अद्भुत

1

आप सापेक्ष पथ भी लिख सकते हैं। तरह

रूप

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

या

$destinationPath= 'public/img/';

संबंधित मुद्दे