J'utilise XMLHttpRequest
pour envoyer un fichier du code javascript
à une django view
Je dois détecter si le fichier a été envoyé ou si une erreur est survenue. J'ai utilisé jquery pour écrire le javascript suivant.
Idéalement, je voudrais montrer à l'utilisateur un message d'erreur selon lequel le fichier n'a pas été téléchargé. Y a-t-il un moyen de le faire en javascript
?
J'ai essayé de le faire en renvoyant un message de success/failure
de la django view
de django view
, en mettant le success/failed message
tant que json
et en renvoyant le json sérialisé depuis la django view
. Pour cela, j'ai créé le xhr.open()
non-asynchronous
. J'ai essayé d'imprimer le xmlhttpRequest
objet console.log(xhr.responseText)
. La console.log(xhr.responseText)
montre
response= {"message": "success"}
Ce que je me demande, c'est que ce soit le bon moyen de le faire. Dans de nombreux articles, j'ai trouvé l'avertissement que
L'utilisation d'async = false n'est pas recommandée
Alors, est-il possible de savoir si le fichier a été envoyé, tout en maintenant xhr.open()
asynchrone?
$(document).ready(function(){ $(document).on('change', '#fselect', function(e){ e.preventDefault(); sendFile(); }); }); function sendFile(){ var form = $('#fileform').get(0); var formData = new FormData(form); var file = $('#fselect').get(0).files[0]; var xhr = new XMLHttpRequest(); formData.append('myfile', file); xhr.open('POST', 'uploadfile/', false); xhr.send(formData); console.log('response=',xhr.responseText); }
Ma vue django
extrait le fichier des données de formulaire et les écrit dans un dossier de destination.
def store_uploaded_file(request): message='failed' to_return = {} if (request.method == 'POST'): if request.FILES.has_key('myfile'): file = request.FILES['myfile'] with open('/uploadpath/%s' % file.name, 'wb+') as dest: for chunk in file.chunks(): dest.write(chunk) message="success" to_return['message']= message serialized = simplejson.dumps(to_return) if store_message == "success": return HttpResponse(serialized, mimetype="application/json") else: return HttpResponseServerError(serialized, mimetype="application/json")
MODIFIER:
J'ai travaillé avec l'aide de @ FabrícioMatté
xhr.onreadystatechange=function(){ if (xhr.readyState==4 && xhr.status==200){ console.log('xhr.readyState=',xhr.readyState); console.log('xhr.status=',xhr.status); console.log('response=',xhr.responseText); var data = $.parseJSON(xhr.responseText); var uploadResult = data['message'] console.log('uploadResult=',uploadResult); if (uploadResult=='failure'){ console.log('failed to upload file'); displayError('failed to upload'); }else if (uploadResult=='success'){ console.log('successfully uploaded file'); } } }
XMLHttpRequest
objets XMLHttpRequest
contiennent les propriétés status
et readyState
, que vous pouvez tester dans l'événement xhr.onreadystatechange
pour vérifier si votre demande a réussi.
Quelque chose comme le code suivant devrait faire le travail:
xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState === 4) { var response = JSON.parse(xmlhttp.responseText); if (xmlhttp.status === 200 && response.status === 'OK') { console.log('successful'); } else { console.log('failed'); } } }