लार्वा 5 में स्टोरेज फेस का उपयोग करके फाइल URL कैसे प्राप्त करें?


83

मैं Laravel 5 के साथ नए फ्लाईसिस्टम एकीकरण का उपयोग कर रहा हूं। मैं डीबी को 'स्थानीयकृत' पथ संग्रहीत कर रहा हूं, और पथ को पूरा करने के लिए स्टोरेज मोहरा प्राप्त कर रहा हूं। उदाहरण के लिए मैं स्टोर screenshots/1.jpgऔर उपयोग कर रहा हूं

Storage::disk('local')->get('screenshots/1.jpg')

या

Storage::disk('s3')->get('screenshots/1.jpg') 

मैं एक ही फाइल को अलग-अलग डिस्क पर पुनः प्राप्त कर सकता हूं।

get फ़ाइल सामग्री पुनर्प्राप्त करता है, लेकिन मैं इसे इस तरह से अपने विचारों में उपयोग करने की उम्मीद कर रहा हूं:

<img src="{{ Storage::path('screenshots/1.jpg') }}" />

लेकिन पथ, या पूर्ण पथ को पुनः प्राप्त करने में सक्षम कुछ भी उपलब्ध नहीं है (जहाँ तक मैं देख सकता हूँ)। तो मैं पूरा रास्ता कैसे लौटा सकता हूं? या, मैं सोच रहा हूं कि क्या यह डिजाइन द्वारा है? यदि हां, तो मैं पूर्ण पथ प्राप्त करने में सक्षम क्यों नहीं हूं? या, मैं इस बारे में पूरी तरह से गलत तरीके से जा रहा हूं?


1
आप url के लिए पूछ रहे हैं न कि रास्ता।
एडम

जवाबों:


54

संपादित करें: L5.2 + के लिए समाधान

एक बेहतर और अधिक सरल समाधान है।

Storage::url($filename)किसी दिए गए फ़ाइल का पूर्ण पथ / URL प्राप्त करने के लिए उपयोग करें । ध्यान दें कि आपको S3अपने भंडारण फाइल सिस्टम के रूप में सेट करने की आवश्यकता है config/filesystems.php:'default' => 's3'

बेशक, आप भी Storage::disk('s3')->url($filename)उसी तरह से कर सकते हैं ।

जैसा कि आप देख सकते हैं कि config/filesystems.phpएक 'cloud' => 's3'परिभाषित पैरामीटर भी है , जो क्लाउड फाइल सिस्टम को संदर्भित करता है। यदि आप स्थानीय सर्वर में स्टोरेज फ़ोल्डर को मिटाना चाहते हैं, लेकिन क्लाउड उपयोग में कुछ फ़ाइलों को पुनः प्राप्त / संग्रहीत करते हैं Storage::cloud(), जिसमें एक ही फाइल सिस्टम विधियाँ भी हैं Storage::cloud()->url($filename)

लारवेल प्रलेखन इस पद्धति का उल्लेख नहीं करता है, लेकिन यदि आप इसके बारे में अधिक जानना चाहते हैं, तो आप इसके स्रोत कोड की जांच कर सकते हैं


अच्छा! यह एक नई विधि है , लेकिन मुझे खुशी है कि अब यह यहाँ है! क्या भंडारण वर्ग डिफ़ॉल्ट रूप से विचारों में काम करता है? यदि हां, तो इसे सही उत्तर के रूप में चिह्नित करेंगे।
दावतीसर

हाँ! यह डिफ़ॉल्ट रूप से आपके विचारों में काम करता है, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।
पेरे जोआन मार्टोरेल

5
यह L5.2 + के लिए है
daviestar

153

आपके संग्रहण डिस्क का पथ होगा:

$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()

मैं उस के लिए किसी भी छोटे समाधान नहीं जानता ...

आप अपने दृश्य में $ संग्रहण साझा कर सकते हैं और फिर कॉल कर सकते हैं

$storagePath."/myImg.jpg";

यह सार्वजनिक भंडारण फ़ोल्डर का पथ प्राप्त करने के लिए सही समाधान है। धन्यवाद!
डेविड

14
applyPathPrefixइस तरह का उपयोग करने के लिए एक और तरीका है :Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix('myImg.jpg');
मैक्सिम लानिन

3
@ मैक्सिमलिन यदि आप उस पेस्ट को कॉपी करते हैं, तो आपको एक त्रुटि मिलेगी। पहले applyPathPrefixआप कॉपी कर सकते हैं। बहुत अजीब। (आप अपने उदाहरण में अंतिम विधि नाम पर डबल क्लिक करके इसका परीक्षण कर सकते हैं।
मौरिस

3
getDriver()आवश्यकता नहीं है। सीधे शब्दों में Storage::disk('local')->getAdapter()->getPathPrefix()रूप में अच्छी तरह से काम करेगा।
आरए

6
शायद यह जानकर अच्छा लगा कि लारवेल 5.4 के बाद से एक नया, सरल तरीका है Storage::path, बिलाल का जवाब
मार्टन कोएत्सिएर

69

यह विधि Laravel 5.4 के बाद से मौजूद है, आप इसे इसके द्वारा प्राप्त कर सकते हैं:

$path = Storage::disk('public')->path($filename);

1
लारवेल 5.6 में एक आकर्षण की तरह काम करता है। अगर कोई व्यक्ति एपीआई में इस बारे में सोचता है, तो यह यहाँ है: laravel.com/api/5.6/Illuminate/Filesystem/…
एंजेल सैंटियागो

1
जहाँ तक मैं देख सकता हूँ, यह विधि Laravel 5.4 ( laravel.com/api/5.4/Illuminate/Filesystem/… ) के बाद से मौजूद है
मार्टन कोएटिएर

उपरोक्त दोनों टिप्पणियों में दोनों लिंक मृत हैं।
डॉटनेट

9

यह है कि मुझे यह काम करने के लिए कैसे मिला - एक पर्यावरण चर के साथ s3 और स्थानीय निर्देशिका पथों के बीच स्विच करना, सभी दृश्यों के लिए मार्ग को पार करना।

.Env में:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

Config / filesystems.php में:

'default' => env('APP_FILESYSTEM'),

इन app/Providers/AppServiceProvider:

public function boot()
{
    view()->share('dynamic_storage', $this->storagePath());
}

protected function storagePath()
{
    if (Storage::getDefaultDriver() == 's3') {
        return Storage::getDriver()
                ->getAdapter()
                ->getClient()
                ->getObjectUrl(env('S3_BUCKET'), '');
    }

    return URL::to('/');
}

1
वर्णन के रूप में s3 संग्रहण का उपयोग करना मेरे लिए एक त्रुटि उत्पन्न करता है। इसलिए मैंने इसके उदाहरण में संशोधन किया return Storage::disk('s3')->getDriver()->getAdapter()->getClient()->getObjectUrl(env('S3_BUCKET'), '').'/';
लियोनेल मॉरिसन

5

पहले फ़ाइल url / लिंक और फिर नीचे की ओर पथ प्राप्त करें:

$url = Storage::disk('public')->url($filename);
$path = public_path($url);

5

यदि आप केवल संग्रहण (डिस्क) पथ का उपयोग करना चाहते हैं, तो इसका उपयोग करें:

Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage

इसके अलावा, यदि आप रुचि रखते हैं, तो मैंने एक पैकेज ( https://github.com/fsasvari/laravel-uploadify ) को केवल लारवेल के लिए बनाया है ताकि आप उन सभी फ़ील्डों का उपयोग कर सकें जो एलक्वेंट मॉडल फ़ील्ड्स पर हैं:

$car = Car::first();

$car->upload_cover_image->url();
$car->upload_cover_image->name();
$car->upload_cover_image->basename();
$car->upload_cover_image->extension();
$car->upload_cover_image->filesize();

4

खैर, हफ्तों पहले मैंने एक बहुत ही अनजान प्रश्न किया ( स्टोरेज के माध्यम से अपलोड की गई फ़ाइल से सीडीएन यूआरएल प्राप्त करें ): मैं चाहता था कि सीडीएन यूआरएल को मेरे विचार में दिखाया जाए (जैसा कि आपको आवश्यक है)।

हालांकि, पैकेज एपीआई की समीक्षा के बाद मैंने पुष्टि की कि इस कार्य को करने का कोई तरीका नहीं है। तो, मेरे समाधान का उपयोग करने से बचना था flysystem। मेरे मामले में, मुझे रैकस्पेस के साथ खेलने की जरूरत है। तो, अंत में मेरा उपयोग पैकेज बनाने और OpenStack के लिए PHP SDK का उपयोग करके अपना स्वयं का भंडारण पैकेज बनाने का निर्णय लें

इस तरह, आपके पास उन कार्यों के लिए पूर्ण पहुंच है, जिन्हें आपको getPublicUrl()सीडीएन कंटेनर से सार्वजनिक URL प्राप्त करने के लिए आवश्यक है:

/** @var DataObject $file */
$file = \OpenCloud::container('cdn')->getObject('screenshots/1.jpg');

// $url:  https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg
$url = (string) $file->getPublicUrl(UrlType::SSL);

निष्कर्ष में, यदि भंडारण सेवा को दूसरे स्तर पर ले जाने की आवश्यकता है, तो flysystemपर्याप्त नहीं है। localप्रयोजनों के लिए, आप @ nXu के समाधान का प्रयास कर सकते हैं


3

यदि आपको फ़ाइल का पूर्ण URL चाहिए, तो नीचे दिए गए कोड का उपयोग करें:

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg

2

स्टोर विधि:

public function upload($img){
   $filename = Carbon::now() . '-' .  $img->getClientOriginalName();
   return Storage::put($filename, File::get($img)) ? $filename : '';
}

रूट:

 Route::get('image/{filename}', [
        'as'   => 'product.image',
        'uses' => 'ProductController@getImage',
    ]);

नियंत्रक:

 public function getImage($filename)
    {
        $file = Storage::get($filename);

        return new Response($file, 200);
    }

राय:

 <img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/>

कोई ऐसा क्यों करेगा, क्यों s3 का उपयोग करते हुए फिर वेब सर्वर में इसका उपयोग करें !!
Shady Keshk

2

एक और समाधान मैंने पाया है:

Storage::disk('documents')->getDriver()->getConfig()->get('url')

दस्तावेज़ के आधार पथ के साथ url लौटाएगा भंडारण


1

इस पर एक नज़र डालें: लारवेल 4 में एक छवि को देखने के लिए storage_path () का उपयोग कैसे करें । यही बात लारवेल 5 पर भी लागू होती है:

संग्रहण फ़ाइल सिस्टम के लिए है, और इसका अधिकांश भाग वेब सर्वर के लिए सुलभ नहीं है। अनुशंसित समाधान public/screenshots/उदाहरण के लिए , सार्वजनिक फ़ोल्डर (जो दस्तावेज़ रूट है) में कहीं छवियों को संग्रहीत करना है । फिर जब आप उन्हें प्रदर्शित करना चाहते हैं, का उपयोग करें asset('screenshots/1.jpg')


मैं एक 'डिस्क' को स्थापित करने की कोशिश कर रहा हूं जब मेरा सार्वजनिक फ़ोल्डर हो रहा है जब विकासशील और s3 जब लाइव
daviestar

यह वास्तव में कोई फर्क नहीं पड़ता है, Storage::path()आपके सर्वर पर फ़ाइल का पथ लौटाता है, लेकिन आपको इसके लिए एक URL की आवश्यकता है और वेबसर्वर केवल आपके दस्तावेज़ रूट से फ़ाइलों की सेवा कर सकता है, जो है <project>/public। इसके अंदर अपनी निर्देशिका बनाएं और ब्लेड टेम्पलेट्स में उपयोग करें url()या asset()
nXu

2
Storage::path()मौजूद नहीं है, मैं इसे पसंद
करूंगा

ठीक है, मुझे गलत समझा, क्षमा करें। मैं क्या करूंगा, अभी भी वही है: DB के लिए पूरा रास्ता बचाओ, यह स्थानीय हो या s3। छवियां अपलोड / बनाते समय, बस यह जांचना getenv('debug')और तय करना है कि किसका उपयोग करना है।
nXu

मैं पूरा रास्ता बचाने से बचने की कोशिश कर रहा था लेकिन शायद यह जाने का सबसे समझदार रास्ता है।
डेविएस्टार

1

मेरे मामले में, मैंने इस फाइल में, स्थानीय फ़ाइलों के लिए अलग-अलग विधि बनाई: src / Illuminate / Filesystem / FilesystemAdv.pp

    /**
 * Get the local path for the given filename.
 * @param $path
 * @return string
 */
public function localPath($path)
{
    $adapter = $this->driver->getAdapter();
    if ($adapter instanceof LocalAdapter) {
        return $adapter->getPathPrefix().$path;
    } else {
        throw new RuntimeException('This driver does not support retrieving local path');
    }
}

फिर, मैं फ्रेमवर्क के लिए पुल अनुरोध बनाता हूं, लेकिन यह अभी भी मुख्य कोर में विलय नहीं हुआ है: https://github.com/laravel/framework/pull/13605 हो सकता है कि कोई इसे मर्ज करें)


0

लारवल 7 पर 2020 में मेरे लिए यह काम

        $image_resize = Image::make($image->getRealPath());
        $image_resize->resize(800,600);
        $image_resize->save(Storage::disk('episodes')->path('') . $imgname);

तो आप इसे इस तरह से उपयोग कर सकते हैं

echo Storage::disk('public')->path('');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.