问题
First of all, i've checked questions file-upload-in-vuetify and vuetify-file-uploads. But the solutions there didn't work.
I'm trying to use vuetify 2 <v-file-input>
to send multiple PDF files. I created the FormData
object and appended all my files but when i attempt to submit it doesn't reach my backend. I just get an empty object. this is my code:
Template:
<v-layout>
<v-flex>
<v-file-input show-size counter chips multiple label="Arquivo Geral" ref="myfile" v-model="files"></v-file-input>
</v-flex>
<v-flex>
<v-btn color="primary" text @click="submitFiles">test</v-btn>
</v-flex>
</v-layout>
script:
data() {
return {
files: null,
}
}
methods: {
submitFiles(){
let formData = new FormData()
if(this.files){
for( let file in this.files){
formData.append("cave", file)
}
console.log(formData.getAll("cave"))
console.log(this.files)
axios.post('https://eniwp6w65oc77.x.pipedream.net/',
{
files: formData,
test: "test"
},
{
headers: {
'Content-Type': 'multipart/form-data'
}
}).then( response => {
console.log('Success!')
console.log({response})
}).catch(error => {
console.log({error})
})
}
else {
console.log('there are no files.')
}
}
}
my response body and header in requestbin:
body:
{
"files": {},
"test": "test"
}
header:
host: eniwp6w65oc77.x.pipedream.net
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pt;q=0.8,gl;q=0.7
Cache-Control: no-cache
Content-Type: multipart/form-data
Origin: http://localhost:8000
Pragma: no-cache
Referer: http://localhost:8000/
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Content-Length: 28
Connection: keep-alive
回答1:
First of all, you have two bugs in code:
Where you're preparing
FormData
object. You can't use for-in loop for iterating an array of files here sincefor-in
loops over enumerable property names of an object. You can use for-of loop instead.You're using
formData
in brackets. You should passFormData
instance, not JSON. To send aditional paramaters like"test"
usingFormData
doformData.append("test", "foo bar")
Also check that your backend properly handles multipart/form-data
data. If your backend is in Node.js
and Express.js
then you should use proper body parser middleware, for example multer
Here is a working example:
Node.js/Express.js backend:
const multer = require("multer"),
...
router.post("/upload-files", multer().array("files"), function (req, res) {
console.log("body: ", req.body);
console.log("files:", req.files);
return res.sendStatus(200);
});
frontend:
submitFiles() {
if (this.files) {
let formData = new FormData();
// files
for (let file of this.files) {
formData.append("files", file, file.name);
}
// additional data
formData.append("test", "foo bar");
axios
.post("/upload-files", formData)
.then(response => {
console.log("Success!");
console.log({ response });
})
.catch(error => {
console.log({ error });
});
} else {
console.log("there are no files.");
}
}
Note that you don't need to set Content-Type
header manually when you pass FormData
as a POST
request body
来源:https://stackoverflow.com/questions/57773556/file-upload-using-vuetify-2-v-file-input-and-axios