Skip to content

Commit 8517bec

Browse files
author
Gareth Redfern
committed
add file upload functionality using FormData
1 parent 258374e commit 8517bec

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

src/components/FileUpload.vue

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
<template>
22
<form @submit.prevent="uploadFile">
3-
<BaseInput
4-
type="file"
5-
:label="label"
6-
name="file"
7-
v-model="file"
8-
:accept="fileTypes"
9-
class="mb-4"
10-
/>
11-
<div>
12-
<BaseBtn text="Upload" />
3+
<div class="mb-4">
4+
<label for="file" class="sr-only">
5+
{{ label }}
6+
</label>
7+
<input
8+
type="file"
9+
:accept="fileTypes"
10+
@change="fileChange"
11+
id="file"
12+
class="appearance-none"
13+
/>
1314
</div>
14-
<FlashMessage :error="error" />
15+
<BaseBtn text="Upload" />
16+
<FlashMessage :message="message" :error="error" />
1517
</form>
1618
</template>
1719

1820
<script>
1921
import { getError } from "@/utils/helpers";
2022
import BaseBtn from "@/components/BaseBtn";
21-
import BaseInput from "@/components/BaseInput";
2223
import FileService from "@/services/FileService";
2324
import FlashMessage from "@/components/FlashMessage";
2425
@@ -29,14 +30,17 @@ export default {
2930
type: Array,
3031
default: null,
3132
},
33+
endpoint: {
34+
type: String,
35+
required: true,
36+
},
3237
label: {
3338
type: String,
3439
default: "",
3540
},
3641
},
3742
components: {
3843
BaseBtn,
39-
BaseInput,
4044
FlashMessage,
4145
},
4246
data() {
@@ -47,8 +51,21 @@ export default {
4751
};
4852
},
4953
methods: {
54+
clearMessage() {
55+
this.error = null;
56+
this.message = null;
57+
},
58+
fileChange(event) {
59+
this.clearMessage();
60+
this.file = event.target.files[0];
61+
},
5062
uploadFile() {
5163
const payload = {};
64+
const formData = new FormData();
65+
formData.append("file", this.file);
66+
payload.file = formData;
67+
payload.endpoint = this.endpoint;
68+
this.clearMessage();
5269
FileService.uploadFile(payload)
5370
.then(() => (this.message = "File uploaded."))
5471
.catch((error) => (this.error = getError(error)));

src/services/FileService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import * as API from "@/services/API";
22

33
export default {
44
async uploadFile(payload) {
5-
await API.apiClient.post("", payload);
5+
await API.apiClient.post(payload.endpoint, payload.file);
66
},
77
};

src/views/User.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
<UpdatePassword class="p-5 bg-white border rounded shadow" />
77
<FileUpload
88
label="Upload Avatar"
9+
:fileTypes="['image/*']"
10+
endpoint="/users/auth/avatar"
911
class="p-5 bg-white border rounded shadow"
1012
/>
1113
</div>

0 commit comments

Comments
 (0)