You have the right idea. You have to use FormData rather than JSON when sending it with axios (for image uploads).
You have a lot of stuff going on right now in your vue file that may be unnecessary. I'm going to post a snippet of what I suggest you do
<template>
<div v-if="!image">
<small class="changeUpload">Change/Upload</small>
<input ref="image" type="file" @change="onFileChange">
</div>
<div v-else>
<!--<img :src="image" />-->
<button @click="removeImage" class="btn-link">Remove image</button>
</div>
</template>
// method
gatherFormData() {
const data = new FormData();
data.append('image', this.$refs.image.files[0]);
data.append('id', this.dog_id);
return data;
}
// axios
axios.post('/member/dog/profile/upload/' + this.dog_id, this.gatherFormData())
.then(() => {
// Success
});