#laravel #image #file-upload #upload #edit
#laravel #изображение #загрузка файла #загрузка #Редактировать
Вопрос:
Я пытаюсь отредактировать / обновить изображение в таблице пользователей, когда я выбираю новое изображение и отправляю форму, имя изображения не сохраняется в базе данных вместо этого C:wamp64tmpphpAE1C.tmp сохраниться в столбце изображение, я не знаю почему, пожалуйста, помогите, если вы знаете почему.
Пользовательский контроллер
public function update(Request $request, $id)
{
$request->validate([
'name' => 'required|string|max:225',
'email' => 'required|string|email|max:255|unique:users,email,'.auth()->id(),
'password' => 'sometimes|nullable|string|min:6|confirmed',
]);
$user = auth()->user();
//Handle avatar Upload
if ($request->hasFile('avatar')) {
// Get filename with extention
$filenamewithExt = $request->file('avatar')->getClientOriginalName();
// Get just filename
$filename = pathinfo($filenamewithExt, PATHINFO_FILENAME);
// Get just Extention
$extention = $request->file('avatar')->getClientOriginalExtension();
// Filename to store
$filenameToStore = $filename.'_'.time().'.'.$extention;
// Upload Image
$path = $request->file('avatar')->storeAs('public/avatars', $filenameToStore);
}
if ($request->hasFile('avatar')) {
$user->avatar = $filenameToStore;
}
//Handle image Upload
if ($request->hasFile('image')) {
// Get filename with extention
$ImageNameWithExt = $request->file('image')->getClientOriginalName();
// Get just filename
$ImageName = pathinfo($ImageNameWithExt, PATHINFO_FILENAME);
// Get just Extention
$Extentions = $request->file('image')->getClientOriginalExtension();
// Filename to store
$ImageNameToStore = $ImageName.'_'.time().'.'.$Extentions;
// Upload Image
$paths = $request->file('image')->storeAs('public/images', $ImageNameToStore);
}
if ($request->hasFile('image')) {
$user->image = $ImageNameToStore;
}
$user->save();
$input = $request->except('password', 'password_confirmation');
if (!$request->filled('password')) {
$user->fill($input)->save();
return back()->with('success', 'Profile updated successfully!');
}
$user->password = bcrypt($request->password);
$user->fill($input)->save();
return back()->with('success', 'Profile and password updated successfully');
}
Поле ввода изображения в edit.blade
<div class="form-group col-md">
<div class="custom-file">
<input type="file" name="image" class="custom-file-input" id="customFile" >
<label class="custom-file-label text-align-left" style="text-align:left;"
for="customFile">Choose file</label>
</div>
</div>
Комментарии:
1. Изображение правильно сохранено в вашем каталоге?
2. Я думаю, вам не следует указывать «общедоступный» как часть пути. Третьим аргументом
storeAs()
метода является имя диска. Также что такое$user->password = bcrypt($request->password);
??? Не делайте этого. ИспользуйтеHash
фасад.3. @sta нет, изображение не сохраняется в каталоге
4. По умолчанию в файловой системе используется диск по умолчанию с именем «local», который загружает файлы в хранилище папок / приложений, используя store, stroeAs и т. Д
5. @sta okay будет использовать хэш, но я использовал public как часть пути для хранения изображения аватара, которое работает нормально, а также при создании пользователя для регистрации я использовал public / images и тоже работает нормально!
Ответ №1:
Я предлагаю вам изменить это :
$input = $request->except('password', 'password_confirmation');
Для,
$input = $request->except('password', 'password_confirmation','image','avatar');
if ($request->hasFile('image')) {
$input['image'] = $ImageNameToStore;
}
if ($request->hasFile('avatar')) {
$input['avatar'] = $filenameToStore;
}
При использовании fill
или update
для сохранения данных запроса всегда лучше исключить поля изображения. Для любых загруженных изображений в данных запроса нет особого смысла хранить необработанные данные изображения в базе данных.
Скорее изображение может быть сохранено либо на локальном диске, либо на чем-то вроде S3, а path
сохраненное изображение должно храниться в базе данных, соответствующей полю изображения, например, avatar
Комментарии:
1. Я думаю, вы все правильно поняли, но, возможно, было бы неплохо объяснить, зачем вносить это изменение. Также, возможно, улучшите их код, чтобы они не сохранялись несколько раз!
2. хорошо, я только что проверил каталог public / images, и изображение было сохранено, но имя изображения по-прежнему сохранено как C:wamp64tmpphpAE1C.tmp в столбце изображение
3. Хорошо, я попробую ваше предложение, спасибо
4. @miken32 изменение заключается в том, что пользователь хочет отредактировать информацию о странице своего профиля, на которой также есть изображение, загруженное им во время регистрации, поэтому, когда они хотят изменить изображение, которое они изначально загрузили, они могут это сделать. предложение sta сработало для меня, но я ученик, если есть другой способ сделать это, я буду признателен, если вы поделитесь им со мной. Спасибо
5. Всякий раз, когда в нем есть поля изображений
$request
, всегда лучше исключить эти поля при использованииfill
update
метода или и вместо этого использоватьpath
для сохраненного файла. Одна вещь, которую я знаю, это то, что при запросе ajax изображения / файлы принимаются в двоичном формате и не имеет смысла хранить необработанные данные изображения в базе данных — @miken32