Używając surowego kodu HTML, gdy wysyłam plik na serwer flask, mogę uzyskać dostęp do plików z globalnego żądania flask:
<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>
W kolbie:
def post(self):
if 'file' in request.files:
....
Kiedy próbuję zrobić to samo z Axios, globalne żądanie kolby jest puste:
<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'
}
})
}
Jeśli używam tej samej funkcji uploadFile powyżej, ale usuwam nagłówki json z metody axios.post, otrzymuję w kluczu formularza mojego obiektu żądania kolby listę csv wartości ciągów (plik jest .csv).
Jak mogę uzyskać obiekt pliku wysłany przez axios?
javascript
ajax
file-upload
axios
Don Smythe
źródło
źródło
v-on:change="uploadFile"
zeinput
zamiastform
tagu?Odpowiedzi:
Dodaj plik do
formData
obiektu i ustawContent-Type
nagłówek namultipart/form-data
.źródło
$_FILES
do pobierania plików po stronie serwera, ponieważ używam PHPFormData
. Zgodnie z dokumentem Axiosa obaFile
iFormData
są traktowane tylko jako przeglądarka , więc oba sposoby można zobaczyć tak samo ( github.com/axios/axios#request-config )data:formData
formData.getHeaders()
To jest znany problem z axios; patrz np.https://github.com/axios/axios/issues/789
Przykładowa aplikacja wykorzystująca Vue. Wymaga serwera zaplecza działającego na hoście lokalnym do przetworzenia żądania:
https://codepen.io/pmarimuthu/pen/MqqaOE
źródło
To działa dla mnie, mam nadzieję, że komuś pomoże.
źródło
headers: { 'Content-Type': 'multipart/form-data' }
było jedynym sposobem, w jaki faktycznie wysłał post po otrzymaniu odpowiedzi serwera z opcji. Pewnie coś robię źle, ale działa i zostawiam to w spokoju lol