2009-09-15 5 views
3

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 caractères, et les images pour eux peuvent être changées n'importe quand. Naturellement, les images doivent être redimensionnées et recompressées pour éviter les gros fichiers. Quand le joueur change ses données (parmi lesquelles l'image), puis frappe "save", la validation côté serveur intervient. Il vérifie des choses comme des noms de caractères non-uniques, des champs obligatoires vides, etc. Si des erreurs sont trouvées, elles sont affichées. Dans ce cas, le formulaire doit être pré-rempli avec les données que le joueur a saisies, il n'a donc qu'à changer le bit défectueux, ne pas tout re-taper. Mais comment sauvegardez-vous l'image dans un état "temporaire"?Comment gérez-vous les téléchargements temporaires d'images en PHP?

Je ne peux pas pré-remplir 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 joueur peut simplement fermer son navigateur et abandonner tout le 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 à éditer dans deux onglets du navigateur, ils ne devraient pas entrer en conflit (chacun d'entre eux devrait avoir sa propre copie).

Comment pourriez-vous résoudre ce problème?

Répondre

10

Je voudrais enregistrer le fichier dans un emplacement temporaire et stocker à la fois un identifiant unique ainsi que l'horodatage actuel dans le nom de fichier. Ensuite, placez le nom de fichier dans la session de l'utilisateur. Lorsqu'un utilisateur a créé ou mis à jour son compte avec succès, 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 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 vous avez réussi la validation de création/mise à jour. Cela peut être un peu plus inefficace (lectures de répertoires supplémentaires et éventuellement opérations de fichiers pour chaque soumission réussie), mais à moins de traiter beaucoup de trafic, vous ne le remarquerez probablement pas.

+0

Bonne réponse. Upvoted.Cependant, aussi bizarre que cela puisse paraître, mon client n'aime pas les emplois cron, parce qu'il n'a pas eu affaire avec eux et ne veut pas de nouvelles choses non testées. Peut-être que vous pouvez trouver une autre solution sans emplois cron? –

+0

Bien sûr, il suffit d'incorporer le nettoyage du répertoire dans le code de gestion de téléchargement d'images. Lorsque la validation de création/mise à jour est terminée (avec succès) et que vous supprimez le fichier image temporaire, scannez le reste du répertoire pour rechercher les images expirées et supprimez-les. – pix0r

+0

Eh bien ... c'est une option. En fait, je me suis déjà contenté de le stocker en session au lieu d'un dossier temporaire (je stocke des sessions en MySQL). Puisque l'image redimensionnée sera assez petite, je pense que ce n'est pas un gros problème. –

0

Créer une table pour contenir des références à des images.

Lorsqu'un fichier est téléchargé, si c'est une image valide, faites tout votre redimensionnement, etc., et créez un enregistrement dans la table qui pointe sur le fichier. Transmettez l'ID de l'enregistrement de référence avec les données de formulaire.

Affichez l'image lorsque vous réaffichez le formulaire, afin que l'utilisateur sache qu'il n'est pas nécessaire de le réimporter. Lorsque vous acceptez finalement le nouvel objet de caractère, définissez avatar_id ou quoi que ce soit.

Exécutez un travail cron standard pour supprimer les enregistrements d'images orphelins (en supprimant également les fichiers sur le disque).

0

Vous pouvez toujours remplir une zone de texte désactivée pour contenir le nom de l'image - elle ne remplira pas le champ de saisie de navigation, mais vaut mieux que rien. Pour l'édition, pour éviter les conflits, vous pouvez créer une colonne "modifing" pour les caractères de chaque utilisateur, et dans une requête d'édition de caractères, changer la valeur à true. Lorsque l'utilisateur enregistre le caractère, le redéfinir sur false. Pour chaque demande d'édition, accordez-la uniquement lorsque la "modification" est fausse.

+0

Il serait difficile de fermer l'onglet avec un formulaire d'édition ouvert. Le verrou ne serait pas levé, et il ne pourrait rien modifier d'autre. –

0

Je vous recommande de mettre à jour l'image immédiatement, indépendamment de l'erreur dans le formulaire, ou de séparer la mise à jour de l'image dans un formulaire distinct. De cette façon, vous allez vous débarrasser de deux problèmes sans machines à états complexes et de nettoyage.

+0

Au détriment de rendre l'interface utilisateur plus ennuyeuse. :( –

+0

Vraiment, peut-être, mais je continuerais à le faire, car rendre les choses plus compliquées qu'elles ne le sont, c'est juste demander des ennuis. –

Questions connexes