Я должен изменить изображение профиля пользователя, я использую для этой цели Vuejs, проблема в том, что он передает мне изображение, base64
и когда я делаю декодирование в методе myProfile
контроллера, это просто или он сохраняет номер 1 в аватарке поле таблицы user
или просто передать его null
.
профиль.vue
<template>
<input type="file" name="image" @change="getImage" accept="image/*">
<img :src="avatar" class="img-circle" width="150" />
<a href="" v-show="loaded" class="btn btn-success" @click.prevent="updateAvatar">Upload</a>
</template>
<script>
props: ['auth'],
data() {
return {
user: {},
errorss: {},
showMe: false,
loaded: false,
avatar: '',
}
},
mounted() {
this.user = JSON.parse(this.auth);
this.avatar = this.user.avatar;
},
getImage(e){
let image = e.target.files[0];
let reader = new FileReader();
reader.readAsDataURL(image);
reader.onload = e => {
this.avatar = e.target.result;
}
this.loaded = true;
},
updateAvatar(){
let urlAvatar = '/dashboard/avatar';
//let value = new FormData();
//value.append('image', this.avatar);
const value = {
'image': this.avatar
}
axios.put(urlAvatar, value)
.then((response) => {
let title = response.data.status;
let body = response.data.msg;
this.displayNotificationSuccess(title, body);
})
.catch((e) => {
console.log(e.response.data);
})
},
</script>
Примечание: когда я занимаю FormData()
аватарку, она оказывается пустой
myProfile
Я уже внес столько изменений в этот метод , что в конце концов оставляю его таким, чтобы посмотреть, как они могут меня направить.
мой профиль (пользовательский контроллер)
public function myAvatar(Request $request)
{
$file_data = $request->image;
$avatar = Storage::putFile('public/defaults/users/avatar/', base64_decode($file_data));
$userAvatarUpdate = User::find(Auth::user()->id);
$userAvatarUpdate->avatar = $avatar;
$userAvatarUpdate->update();
return response()->json([
'status' => 'Muy bien!',
'msg' => 'Tu foto de perfil se actualizo.',
], 200);
}
Я видел несколько руководств, но еще не нашел решение, которое соответствует тому, что мне нужно.
Любые идеи? Я использую Laravel 5.6
, Vuejs 2
и Axios
.
Чтобы загрузить изображения с
axios
помощью метода byPUT
, вы можете «обманывать» и отправлять ихpost
изvue
, но в Laravel доступ кPUT
. (могут быть лучшие способы сделать это, но это остается для исследования :))Первой рекомендацией для хранения изображений было бы продолжать использовать,
storage
но, как я заметил, он пытается хранить непосредственно в общей папке проекта, что не совсем правильно, но для примера мы продолжим с этой конфигурацией.Для этого в файле хранилища по
config\filesystems.php
умолчанию вы должны изменить значение папки хранилища для локального ключа, используя это, чтобы оно было равно папке проекта, и в этом мы указываем Laravel, что будет папкаdriver
local
root
public_path
public
defaults
В контроллере он мог просто остаться.
VueJs ( объяснение кода включено)
Для публичного доступа к изображениям у вас будет путь