Как работать с изображением с помощью проверенного метода — запрос формы (Laravel 9)

В моей форме 4 поляname, email, website and image


Когда в мою базу данных передаются только поля name, email, website, следующий код сохраняет данные идеально подходит.

public function store(StoreCompanyRequest $request)
    {
         $validated = $request->validated(); //It will return only validated data
         Company::create($validated); 
     
         return response()->json([
            'success' => true,
            'message' => 'Company Created Successfully',
        ]);
    }

но если пользователь передает image file. Приведенный выше код сохраняет временный путь к изображению.

Это результат:

Как работать с изображением с помощью проверенного метода — запрос формы (Laravel 9)

Выход:$validated

array:4 [  "name" => "infotech"  "email" => "[email protected]"  "logo" => Illuminate\Http\UploadedFile {#310  -test: false  -originalName: "greenscreenman.jpg"  -mimeType: "image/jpeg"  -error: 0  #hashName: null  path: "C:\Users\dummy\AppData\Local\Temp"  filename: "php30CD.tmp"  basename: "php30CD.tmp"  pathname: "C:\Users\dummy\AppData\Local\Temp\php30CD.tmp"  extension: "tmp"  realPath: "C:\Users\dummy\AppData\Local\Temp\php30CD.tmp"  aTime: 2022-03-22 12:52:30  mTime:  2022-03-22 12:52:29  cTime: 2022-03-22 12:52:29  inode: 258750  size: 70458  perms: 0100666  owner: 0  group: 0  type: "file"  writable: true  readable: true  executable: false  file: true  dir: false  link: false  linkTarget: "C:\Users\dummy\AppData\Local\Temp\php30CD.tmp"  }  "website" => "www.infotech.com" ]

Я написал другой код, который устраняет эту проблему,

public function store(StoreCompanyRequest $request)
    {
         $validated = $request->validated(); //It will return only validated data
        //  Company::create($validated); 

         $company = new Company;
         $company->name = $validated['name'];
         $company->email = $validated['email'];
         $company->website = $validated['website'];

         $logoName = time().'.'.$request->file('logo')->extension(); 
         $logoPath = $request->file('logo')->storeAs('public/files', $logoName);

         $company->logo = $logoName;
         $company->save();

         return response()->json([
            'success' => true,
            'message' => 'Company Created Successfully',
        ]);
    }

Но есть ли способ сохранить правильное расположение изображения с самым первым блоком кода???

Вопрос немного не ясен. Если вы спрашиваете, как «использовать меньше строк», вы можете начать с 1-лайнер, показанный в документах для хранения файла, добавить полученный $path к вашим $validated данным, а затем сохранить. Если вы хотите больше контролировать детали, вам понадобится «больше строк». Если целью является «меньше строк», вы можете выделить эту часть в отдельный метод... Есть много способов решить любую проблему, это ничем не отличается. SO предназначен для помощи в решении конкретных проблем, а не мнений о разных подходах.

Don't Panic 21.03.2022 23:45

Привет @Don'tPanic, я более ясно изложил свой вопрос, не могли бы вы ответить?

Simarpal Singh 22.03.2022 15:05

Выполните переименование изображения / storeAs(), используя код, который у вас есть во 2-м блоке ($logoName = time().'.'.$request->file('logo')->extension(); $request->file('logo')->storeAs('public/files', $logoName);), затем вызовите $validated['logo'] = $logoName;, затем вы можете вызвать Company::create($validated);. Порядок операций и изменение $validated требуется, если вы хотите использовать ::create() вместо ->save(). Примечание: во втором блоке нет ничего плохого, кроме того, что он немного более подробный. Опять же, stackoverflow — это не место для проверки кода, а скорее помощь в решении конкретных проблем.

Tim Lewis 22.03.2022 15:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

is there any way to save the right location of the image with the very first code block

Нет, потому что первый блок кода ничего не делает, кроме проверки ввода перед его сохранением. Загрузка файлов требует дополнительной работы. документы — хорошее место для начала.

Вот что я описал в своем комментарии.

Если вам нужен некоторый контроль над именем файла:

public function store(StoreCompanyRequest $request)
{
    $validated = $request->validated();

    $path = $request->file('logo')->storeAs(
        'public/files', 
        time() . '.' . $request->file('logo')->extension()
    );

    $validated['logo'] = basename($path);

    Company::create($validated); 

     return response()->json([
        'success' => true,
        'message' => 'Company Created Successfully',
    ]);
}

Если вам не нужен контроль над именем файла, вы можете заставить Laravel сделать за вас немного больше работы:

public function store(StoreCompanyRequest $request)
{
    $validated = $request->validated();

    $path = $request->file('logo')->store('public/files');
    $validated['logo'] = basename($path);

    Company::create($validated); 

     return response()->json([
        'success' => true,
        'message' => 'Company Created Successfully',
    ]);
}

Другие вопросы по теме