Question

Je crée un jeu en ligne en PHP où les utilisateurs peuvent créer des personnages jouables. Chaque personnage peut avoir un portrait téléchargé par l'utilisateur. Un joueur peut avoir simultanément plusieurs personnages et les images correspondantes peuvent être modifiés à tout moment. Naturellement, les images doivent être redimensionnées et recompressées pour éviter les fichiers volumineux. Voici mon problème:

Lorsque le joueur modifie ses données (notamment l'image), puis clique sur "Enregistrer", la validation côté serveur débute. Elle vérifie la présence de noms de caractères non uniques, de champs obligatoires vides, etc. En cas d'erreur sont trouvés, ils sont affichés. Dans ce cas, le formulaire doit être pré-rempli avec les données entrées par le joueur. Il ne doit donc que changer le bit défectueux, et non tout ressaisir. Mais comment enregistrer la photo dans un tel dossier "temporaire"? état?

Je ne peux pas pré-renseigner le champ de téléchargement de fichier, les navigateurs ne le permettent pas. Si je l'enregistre dans un fichier temporaire, l'image doit alors être nettoyée à un moment donné, car le lecteur peut simplement fermer son navigateur et abandonner l'ensemble du processus. Quand cela devrait-il être? Et quel nom de fichier dois-je choisir pour le fichier temporaire? Si le joueur ouvre le même personnage à modifier dans deux onglets du navigateur, ils ne doivent pas entrer en conflit (chacun d’eux doit avoir sa propre copie).

Comment résoudriez-vous ce problème?

Était-ce utile?

La solution

Je voudrais enregistrer le fichier dans un emplacement temporaire et stocker à la fois un identifiant unique ainsi que l'horodatage actuel dans le nom du fichier. Ensuite, placez le nom de fichier dans la session de l'utilisateur. Lorsqu'un utilisateur a créé ou mis à jour son compte, vous enregistrez le fichier image dans son emplacement permanent et supprimez le fichier temporaire. Vous pouvez exécuter un processus cron pour analyser le répertoire temporaire et vérifier les horodatages, en supprimant tous les fichiers plus anciens que votre date d'expiration (une heure peut-être).

Si vous ne parvenez pas à exécuter un travail cron, vous pouvez toujours lancer le nettoyage du répertoire chaque fois que la validation de la création / mise à jour est réussie. Cela pourrait être un peu plus inefficace (lectures de répertoires supplémentaires et éventuellement opérations de fichiers pour chaque soumission réussie), mais à moins que vous ne traitiez beaucoup de trafic, vous ne le remarquerez probablement même pas.

Autres conseils

Créez un tableau contenant des références aux images.

Lorsqu'un fichier est chargé, s'il s'agit d'une image valide, effectuez tous les redimensionnements, etc., et créez un enregistrement dans la table qui pointe vers le fichier.

Transmettez l'id de l'enregistrement de référence avec les données du formulaire. Affichez l'image lorsque vous réaffichez le formulaire afin que l'utilisateur sache qu'il n'est pas nécessaire de le télécharger à nouveau.

Lorsque vous acceptez enfin le nouvel objet de caractère, définissez avatar_id ou autre.

Exécutez une tâche régulière pour supprimer les enregistrements d'images orphelines (en supprimant également les fichiers sur le disque).

Vous pouvez toujours renseigner une zone de texte désactivée contenant le nom de l'image. Elle ne remplira pas le champ de saisie de la navigation, mais vaut mieux que rien. Pour l'édition, afin d'éviter les conflits, vous pouvez en créer une "modification". colonne pour les caractères de chaque utilisateur, et sur une demande de modification de caractère, définissez la valeur sur true. Lorsque l'utilisateur enregistre le caractère, redéfinissez-le sur false. Pour chaque demande de modification, n'accordez-la que lorsque l'option " modifing " est faux.

Je vous recommande de mettre à jour l'image immédiatement, quelle que soit l'erreur dans le formulaire, ou de séparer l'image de mise à jour vers un formulaire séparé. De cette façon, vous vous débarrasserez de deux problèmes sans machines à états complexes et sans nettoyage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top