It is necessary to send data to the server in the required format, I don’t understand how to organize it correctly, the same JSON structure. You must send when attaching a file (@change), the file itself and a comment. Here is what I was able to do https://codepen.io/JessikaJes/pen/rNvgYwP
<div id="app" class="container">
<div class="block">
<div class="item" v-for="(item, index) in items" :key="index">
<div class="item__title">{{ item.title }}</div>
<div class="item__files">
<div class="file" v-for="(file, index) in item.files">
<input type="file" @change="handleFileUpload()">
<input type="text" placeholder="comment" v-model="file.comment">
</div>
</div>
</div>
</div>
</div>
<script>
new Vue({
el: "#app",
data: {
items: [
{
id: "42",
title: "first",
files: [
{
file: "",
comment: "",
},
{
file: "",
comment: "",
}
],
},
{
id: "78",
title: "second",
files: [
{
file: "",
comment: "",
},
{
file: "",
comment: "",
}
],
},
]
},
methods: {
handleFileUpload() {
let formData = new FormData();
// formData.append("file", this.file);
// formData.append("comment", this.file);
axios
.post(`/api/request/${id}`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
})
.then(function () {
console.log("SUCCESS!!");
})
.catch(function () {
console.log("FAILURE!!");
});
}
}
});
</script>
Advertisement
Answer
Change the code like this:
<template>
<div id="app" class="container">
<div class="block">
<div class="item" v-for="(item, index) in items" :key="index">
<div class="item__title">{{ item.title }}</div>
<div class="item__files">
<div class="file" v-for="(fileObj, index2) in item.files">
<input type="file" v-model="fileObj.file" @change="handleFileUpload($event,fileObj)">
<input type="text" placeholder="comment" v-model="fileObj.comment">
</div>
</div>
</div>
</div>
</div>
<script>
new Vue({
el: "#app",
data: {
items: [
{
id: "42",
title: "first",
files: [
{
file: "",
comment: "",
},
{
file: "",
comment: "",
}
],
},
{
id: "78",
title: "second",
files: [
{
file: "",
comment: "",
},
{
file: "",
comment: "",
}
],
},
]
},
methods:
{
handleFileUpload(event, fileObject)
{
let formData = new FormData();
const file = (event.dataTransfer || event.target).files[0];
formData.append("file", file);
formData.append("comment", fileObject.comment);
axios
.post(`/api/request/${id}`, formData)
.then((response) =>
{
console.log("SUCCESS!!");
})
.catch((error) =>
{
console.log("FAILURE!!");
});
}
}
});
</script>