В моей форме 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. Приведенный выше код сохраняет временный путь к изображению.
Это результат:
Выход:$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',
]);
}
Привет @Don'tPanic, я более ясно изложил свой вопрос, не могли бы вы ответить?
Выполните переименование изображения / 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 — это не место для проверки кода, а скорее помощь в решении конкретных проблем.





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',
]);
}
Вопрос немного не ясен. Если вы спрашиваете, как «использовать меньше строк», вы можете начать с 1-лайнер, показанный в документах для хранения файла, добавить полученный
$pathк вашим$validatedданным, а затем сохранить. Если вы хотите больше контролировать детали, вам понадобится «больше строк». Если целью является «меньше строк», вы можете выделить эту часть в отдельный метод... Есть много способов решить любую проблему, это ничем не отличается. SO предназначен для помощи в решении конкретных проблем, а не мнений о разных подходах.