J'ai des fichiers sensibles à télécharger pour les utilisateurs, et chaque utilisateur est autorisé à télécharger un fichier donné exactement une fois. Si le téléchargement échoue, je souhaite autoriser le re-téléchargement, mais pas autrement.
Il ne suffit pas de s'appuyer sur la journalisation/le traitement de la demande de téléchargement de fichier sur le serveur - J'ai besoin de savoir de façon déterministe quand le fichier est terminé et en place au client, car beaucoup de mes utilisateurs travaillent dans un environnement avec des baisses de connectivité fréquentes.
Le moyen le plus simple pour que cela fonctionne est que le navigateur expose un événement "fichier enregistré" à partir de la boîte de dialogue Enregistrer sous ... qui pourrait être connecté à une fonction JavaScript sur la page de téléchargement (qui pourrait être renvoyée sur le serveur). Mais, l'intuition suggère qu'il pourrait y avoir des failles de sécurité si les navigateurs exposaient cette fonctionnalité, car elle se faufile quelque peu en dehors du bac à sable. Je ne suis pas sûr que ce soit même possible.
I trouvéplusieursautrequestionsdans cette zone , mais rien sur ce problème en particulier .
Des idées?
Edit: Je n'aurais pas dû utiliser le mot "sécurité" dans la question d'origine, désolé d'avoir déclenché les harengs rouges.
Edit 2: Ma formulation "sécurité" a induit les gens en erreur sur des problèmes de sécurité technique, mais vous avez tous les deux confirmé mes soupçons: "non, il n'y a pas de support de navigateur pour cette." Je marque le premier commentateur avec la réponse depuis sa première phrase avait ce que je cherchais. Merci a tous.
Il n'y a pas un tel événement de navigateur en JavaScript et même s'il y en avait, vous ne pouvez pas faire confiance au navigateur de l'utilisateur pour assurer votre sécurité.
Il vaut mieux utiliser un GUID pour générer une URL unique pour chaque téléchargement. Vous pouvez alors par exemple:
Permettez-moi de clarifier la dernière puce. Supposons que vous utilisez Java - vous allez in.read(buffer)
et out.write(buffer)
dans une boucle jusqu'à EOF. Si le client se déconnecte, vous recevrez un IOException
pendant out.write()
et sera en mesure de dire un téléchargement réussi à partir d'un téléchargement interrompu. Sur d'autres plates-formes, je suis sûr qu'il existe des moyens de savoir si la connexion a été perdue ou non.
EDIT: Vous pouvez réellement déclencher un événement de navigateur en utilisant l'astuce décrite dans la réponse acceptée de l'une des questions auxquelles vous avez lié . Ce ne serait cependant pas une solution fiable pour limiter le nombre de téléchargements.
C'est une bonne solution:
http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/
Il fonctionne essentiellement en définissant un cookie dans l'en-tête de réponse du fichier téléchargé, afin que javascript puisse périodiquement vérifier l'existence de ce cookie ...
Pourquoi est-il important que le fichier puisse être téléchargé "exactement une fois"? Une fois le fichier téléchargé, il pourrait être copié, y a-t-il vraiment un problème de sécurité à laisser le même utilisateur télécharger le fichier plus d'une fois?
Sinon, pourriez-vous faire quelque chose comme ceci:
Le résultat final est:
Si cela vous inquiète vraiment, enregistrez chaque demande de téléchargement et exécutez un rapport planifié pour les fichiers téléchargés plusieurs fois. Si quelque chose vous semble louche, vous pouvez alors examiner les journaux de sécurité, parler à l'utilisateur, etc.