লারাভেল 5 - ভিউয়ের মধ্যে স্টোরেজে আপলোড হওয়া চিত্রটি কীভাবে অ্যাক্সেস করবেন?


171

আমি লারাভেল স্টোরেজে ব্যবহারকারীর অবতারগুলি পেয়েছি। আমি কীভাবে এগুলিতে অ্যাক্সেস করতে পারি এবং একটি দৃশ্যে এগুলি রেন্ডার করতে পারি?

সার্ভারটি সমস্ত অনুরোধগুলিতে ইঙ্গিত দিচ্ছে /public, তাই যদি তারা /storageফোল্ডারে থাকে তবে আমি কীভাবে তাদের দেখাব

উত্তর:


349

সেরা পদ্ধতির একটি তৈরি করা সিম্বলিক লিঙ্ক খুব ভাল নির্দিষ্ট @SlateEntropy মত নিচে উত্তর । এটির সাহায্যে সংস্করণ 5.3 থেকে লারাভেল একটি কমান্ড অন্তর্ভুক্ত করেছে যা এটি অবিশ্বাস্যভাবে সহজ করে তোলে:

php artisan storage:link

এটি public/storageআপনার storage/app/publicজন্য থেকে একটি সিমিলিংক তৈরি করে এবং এটির মধ্যে এটিই রয়েছে। এখন যে কোনও ফাইলের /storage/app/publicমতো লিঙ্কের মাধ্যমে অ্যাক্সেস করা যেতে পারে:

http://somedomain.com/storage/image.jpg

যদি কোনও কারণে, আপনি প্রতীকী লিঙ্কগুলি তৈরি করতে না পারেন (সম্ভবত আপনি শেয়ার্ড হোস্টিং ইত্যাদিতে রয়েছেন) বা আপনি কিছু অ্যাক্সেস নিয়ন্ত্রণ যুক্তির পিছনে কিছু ফাইল রক্ষা করতে চান তবে সেখানে একটি বিশেষ রুট রয়েছে যা পড়তে পারে এবং তার বিকল্প রয়েছে ইমেজ পরিবেশন উদাহরণস্বরূপ একটি সাধারণ ক্লোজার রুট:

Route::get('storage/{filename}', function ($filename)
{
    $path = storage_path('public/' . $filename);

    if (!File::exists($path)) {
        abort(404);
    }

    $file = File::get($path);
    $type = File::mimeType($path);

    $response = Response::make($file, 200);
    $response->header("Content-Type", $type);

    return $response;
});

আপনি এখন আপনার ফাইলগুলিকে ঠিক যেমন অ্যাক্সেস করতে পারেন ঠিক তেমনই যদি আপনার কোনও সিমলিংক থাকে:

http://somedomain.com/storage/image.jpg

আপনি যদি হস্তক্ষেপ ইমেজ লাইব্রেরি ব্যবহার করে থাকেন তবে responseজিনিসগুলিকে আরও সুসংহত করার জন্য আপনি এর বিল্ট ইন পদ্ধতি ব্যবহার করতে পারেন :

Route::get('storage/{filename}', function ($filename)
{
    return Image::make(storage_path('public/' . $filename))->response();
});

সতর্কতামূলক

মনে রাখবেন যে ম্যানুয়ালি ফাইলগুলি পরিবেশন করে আপনি একটি পারফরম্যান্স পেনাল্টি বহন করছেন , কারণ আপনি ফাইলের বিষয়বস্তু পড়তে এবং প্রেরণ করার জন্য পুরো লারাভেল অনুরোধের জীবনচক্রটি অতিক্রম করছেন যা এইচটিটিপি সার্ভার হ্যান্ডেল করার চেয়ে যথেষ্ট ধীর


ভাল লাগছে। আমি আরও একটি প্রশ্ন জিজ্ঞাসা করতে চাই। অবতার, থাম্বস এবং এর মতো ফাইলগুলি (ব্যবহারকারীদের কাছ থেকে আপলোড করা ফাইলগুলি) স্টোরেজে সংরক্ষণ করার পরামর্শ দেওয়া হচ্ছে?
টাদেলেক

5
আপনি যেখানে খুশি সেখানে এগুলি সঞ্চয় করতে পারেন, তবে সেগুলি ব্যক্তিগত ফাইল না হলে আমি মনে করি আপনি publicডিরেক্টরিতে সেগুলি সঞ্চয় করা থেকে ভাল । এই ভাবে আপনি কোনও চিত্র প্রতিক্রিয়া রচনা করার ওভারহেড এড়িয়ে যাবেন যা এইচটিটিপি সার্ভারের সাহায্যে আরও দ্রুত পরিচালনা করা যায়।
বোগদান 12'15

2
ব্যক্তিগতভাবে আমি পাবলিক ফোল্ডারে ব্যবহারকারীর ফাইলগুলি সঞ্চয় করব না, যখন স্টোরেজ ফোল্ডারটি স্টোরেজের জন্য ব্যবহার করা হয় তখন আমি জিনিসগুলি অনেক পরিপাটি করে এবং আরও পরিচালিত করে দেখতে পাই।
স্লেট এন্ট্রপি

2
আমি এগুলির একটিরও সুপারিশ করব না কারণ তারপরে আপনি আবার লারাভেল লোড করার ওভারহেড যুক্ত করছেন এবং / অথবা প্রতিটি চিত্র পড়ার জন্য পিএইচপি ব্যবহার করতে পারেন। সিএমডিএসফ্যাট দ্বারা বর্ণিত একটি সিমিলিংক ব্যবহার করা আরও দ্রুত হবে।
ব্যবহারকারী 1960364

4
@ user1960364 এ কারণেই শেষ অনুচ্ছেদটি দৃ strongly়ভাবে সিএমলিংক পদ্ধতির ব্যবহার করার পরামর্শ দেয়। তবে উত্তরটি নিজেই, পারফরম্যান্সের দিক থেকে সেরা সমাধান না হলেও এটি এখনও বৈধ এবং অংশীদারি সার্ভারগুলিতে অ্যাপ্লিকেশন চালিত লোকদের জন্য একমাত্র পন্থা হতে পারে যেখানে সিমলিঙ্কগুলি সেটআপ করা অসম্ভব হতে পারে। উত্তরটি যখন দেখায় যে প্রগতিশীলভাবে আপনি ফাইলগুলি কীভাবে পরিবেশন করতে পারেন তবে যদি এই প্রশ্নটিতে জিজ্ঞাসা করা এনক্রিপ্ট করা ফাইলগুলি পরিবেশনার জন্য হতে পারে ।
বোগদান

53

একটি বিকল্প হ'ল আপনার স্টোরেজ ডিরেক্টরি এবং সর্বজনীন ডিরেক্টরিতে সাবফোল্ডারের মধ্যে একটি প্রতীকী লিঙ্ক তৈরি করা।

উদাহরণ স্বরূপ

ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars

লারাভেলের বিকাশকারী টেলর ওটওয়েল দ্বারা নির্মিত একটি স্থাপনা ব্যবস্থাপক এনভায়ারও এই পদ্ধতি ব্যবহার করেন ।


আমি এতে কিছুটা নতুন এটি কি টার্মিনালে চালানো দরকার বা লারাভেলের কোথাও একটি কনফিগার ফাইলে সংজ্ঞায়িত করা উচিত?
গৌরব মেহতা

হ্যাঁ, আপনার এটি চালানো দরকার যদিও কমান্ড লাইন। আপনি অ্যাপ স্থাপন করার জন্য এটি সেটআপ করা দরকার।
স্লেট এন্ট্রপি

উইন্ডোজ ব্যবহারকারীদের জন্য, আপনি যদি সিএমডি ব্যবহার না করতে চান তবে তার জন্য এখানে একটি স্বতন্ত্র সরঞ্জাম: github.com/amd989/Sllinker#downloads
ডেভিড

3
প্রশ্নটিতে জিজ্ঞাসা করা হয়েছিল যে কীভাবে storageপ্রকাশ্যে সঞ্চিত ব্যবহারকারী অবতারগুলি দেখানো যায় , সাধারণত অবতারদের কোনও ধরণের অ্যাক্সেস নিয়ন্ত্রণের প্রয়োজন হয় না। কোনও ধরণের মিডলওয়্যার বা রুট ব্যবহার করে যদি কোনও সুরক্ষার প্রয়োজন হয় না তবে এটি আপনার সংস্থানগুলিতে কেবল একটি অপচয় hit এটি লক্ষণীয় যেহেতু লারাভেল ৫.২ সিমলিংকগুলি ব্যবহার করে পাবলিক ফাইলগুলির জন্য ( লারাভেল ডকস / ডকস / ৫.২ / ফাইলস সিস্টেম ) পৃথক ফাইল "ডিস্ক" বিদ্যমান exists
স্লেটেনট্রপি

6
লারাভেল 5.3 এ এটি করার জন্য একটি কারিগর কমান্ড রয়েছে: পিএইচপি কারিগর স্টোরেজ: লিঙ্ক
ফিল

22

লারাভেল 5.2 ডক্স অনুসারে আপনার সর্বজনীনভাবে অ্যাক্সেসযোগ্য ফাইলগুলি ডিরেক্টরিতে রাখা উচিত

storage/app/public

তাদের ওয়েব থেকে অ্যাক্সেসযোগ্য করতে, আপনার কাছ থেকে একটি সিম্বলিক লিঙ্ক তৈরি করা উচিত public/storageকাছে storage/app/public

ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage

এখন আপনি আপনার ভিউতে সম্পদ সহায়ক ব্যবহার করে ফাইলগুলিতে একটি URL তৈরি করতে পারেন:

echo asset('storage/file.txt');


13

কারিগরের কমান্ডটি ব্যবহার করে প্রথমে আপনার স্টোরেজ ডিরেক্টরিটির জন্য একটি প্রতীকী লিঙ্ক তৈরি করতে হবে

php artisan storage:link

তারপরে যে কোনও ভিউতে আপনি এই জাতীয় url সহায়তার মাধ্যমে আপনার চিত্রটি অ্যাক্সেস করতে পারেন।

url('storage/avatars/image.png');

4

স্টোরেজ ডিরেক্টরিতে সমস্ত ব্যক্তিগত চিত্র এবং ডক্স সংরক্ষণ করা ভাল তবে আপনার ফাইল ইথারের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে আপনি নির্দিষ্ট ধরণের ব্যবহারকারীকে ফাইল অ্যাক্সেস করতে বা সীমাবদ্ধ করতে পারবেন।

একটি রুট / ডক্স তৈরি করুন এবং যে কোনও নিয়ামক পদ্ধতিতে নির্দেশ করুন:

public function docs() {

    //custom logic

    //check if user is logged in or user have permission to download this file etc

    return response()->download(
        storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'), 
        'filename.png',
        ['Content-Type' => 'image/png']
    );
}

আপনি যখন হিট করবেন localhost:8000/docsফাইলটি উপস্থিত থাকলে ডাউনলোড করা হবে।

root/storage/app/users/documentsউপরের কোড অনুসারে ফাইলটি অবশ্যই ডিরেক্টরিতে হবে , এটি পরীক্ষা করা হয়েছিল Laravel 5.4


4

আপনি যদি অল্প সংখ্যক ব্যক্তিগত চিত্র লোড করতে চান আপনি ছবিগুলি বেস 64 এ এনকোড করতে পারেন এবং এগুলিতে <img src="{{$image_data}}">সরাসরি প্রতিধ্বনি করতে পারেন :

$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;

আমি ব্যক্তিগত হিসাবে উল্লেখ করেছি কারণ আপনি কেবলমাত্র url এর মাধ্যমে প্রকাশ্যে অ্যাক্সেসযোগ্য চিত্রগুলি সঞ্চয় করতে না চাইলে আপনার কেবল এই পদ্ধতিগুলি ব্যবহার করা উচিত, পরিবর্তে আপনাকে অবশ্যই সর্বদা মানক উপায়টি ব্যবহার করতে হবে (লিঙ্ক স্টোরেজ / পাবলিক ফোল্ডার এবং এইচটিটিপি সার্ভারের সাথে চিত্রগুলি পরিবেশন করা)।

base64()দুটি গুরুত্বপূর্ণ নীচের দিক থাকতে এনকোডিং থেকে সাবধান থাকুন :

  1. এটি চিত্রের আকার image 30% বাড়িয়ে তুলবে।
  2. আপনি সমস্ত অনুরোধে সমস্ত আকারের আকার একত্রিত করুন, এগুলি সমান্তরালভাবে লোড না করে কিছু ছোট থাম্বনেইলের ক্ষেত্রে সমস্যা হওয়া উচিত নয় তবে অনেকগুলি চিত্রের জন্য এই পদ্ধতিটি ব্যবহার করা এড়ানো উচিত।

2

আপনি যদি পিএইচপি ব্যবহার করে থাকেন তবে দয়া করে নীচের মত পিএইচপি সিমলিংক ফাংশনটি ব্যবহার করুন:

symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')

ব্যবহারকারীর নাম এবং প্রকল্পের নামটি সঠিক নামগুলিতে পরিবর্তন করুন।


1

সাইটের নাম ছাড়া

{{Storage::url($photoLink)}}

আপনি যদি এপিআই জেএসওএন ফেলিডগুলিতে সংযোজন করার জন্য উদাহরণটিতে সাইটের নাম যুক্ত করতে চান

 public function getPhotoFullLinkAttribute()
{
    return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}

0

আপনি যদি আমার মতো হন এবং আপনার কোনওভাবে পুরো ফাইল পাথ (আমি কিছু গ্লোব () প্যাটার্নের সাথে প্রয়োজনীয় ছবিগুলি মেলালাম তবে আমি সম্পূর্ণ ফাইল পাথ দিয়ে শেষ করব), এবং আপনার স্টোরেজ সেটআপটি ভালভাবে সংযুক্ত রয়েছে (যেমন আপনার পাথগুলি স্ট্রিং রয়েছে storage/app/public/), তারপরে আপনি নীচে আমার ছোট্ট নোংরা হ্যাক ব্যবহার করতে পারেন: পি)

 public static function hackoutFileFromStorageFolder($fullfilePath) {
        if (strpos($fullfilePath, 'storage/app/public/')) {
           $fileParts = explode('storage/app/public/', $fullfilePath);
           if( count($fileParts) > 1){
               return $fileParts[1];
           }
        }

        return '';
    }

0

যদি ডিস্ক 'স্থানীয়' আপনার জন্য কাজ না করে থাকে তবে এটি চেষ্টা করে দেখুন:

  1. জনসাধারণের স্থানীয় পরিবর্তন 'default' => env('FILESYSTEM_DRIVER', 'public'),থেকেproject_folder/config/filesystem.php
  2. কনফিগার ক্যাশে সাফ করুন php artisan config:clear
  3. তারপরে সিম লিঙ্ক তৈরি করুন php artisan storage:link

আপলোড করা চিত্রটির ইউআরএল পেতে আপনি এটি ব্যবহার করতে পারেন Storage::url('iamge_name.jpg');

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.