En utilisant du HTML brut lorsque je publie un fichier sur un serveur flask en utilisant ce qui suit, je peux accéder aux fichiers à partir de la requête flask globale:
<form id="uploadForm" action='upload_file' role="form" method="post" enctype=multipart/form-data>
<input type="file" id="file" name="file">
<input type=submit value=Upload>
</form>
En flacon:
def post(self):
if 'file' in request.files:
....
Quand j'essaye de faire la même chose avec Axios, la requête globale du flacon est vide:
<form id="uploadForm" enctype="multipart/form-data" v-on:change="uploadFile">
<input type="file" id="file" name="file">
</form>
uploadFile: function (event) {
const file = event.target.files[0]
axios.post('upload_file', file, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
Si j'utilise la même fonction uploadFile ci-dessus mais que je supprime les en-têtes json de la méthode axios.post, j'obtiens dans la clé de forme de mon objet de demande de flacon une liste csv de valeurs de chaîne (le fichier est un .csv).
Comment puis-je envoyer un objet fichier via axios?
javascript
ajax
file-upload
axios
Don Smythe
la source
la source
v-on:change="uploadFile"
avecinput
au lieu deform
tag?Réponses:
Ajoutez le fichier à un
formData
objet et définissez l'en-Content-Type
tête surmultipart/form-data
.la source
$_FILES
pour obtenir des fichiers côté serveur car j'utilise PHPFormData
. Selon la documentation d'axios, les deuxFile
etFormData
sont traités comme un navigateur uniquement , de sorte que les deux manières peuvent être vues de manière égale ( github.com/axios/axios#request-config )data:formData
formData.getHeaders()
Ceci est un problème connu avec axios; voir par exemplehttps://github.com/axios/axios/issues/789
Exemple d'application utilisant Vue. Nécessite un serveur backend s'exécutant sur localhost pour traiter la demande:
https://codepen.io/pmarimuthu/pen/MqqaOE
la source
Cela fonctionne pour moi, j'espère aider à quelqu'un.
la source
headers: { 'Content-Type': 'multipart/form-data' }
était le seul moyen d'envoyer le message après avoir obtenu une réponse du serveur à partir d'options. Je fais probablement quelque chose de mal, mais cela fonctionne et je le laisse tranquille lol