2009-12-10 7 views
3

J'utilise actuellement Zend Framework et j'ai un formulaire de téléchargement. Un utilisateur authentifié a la possibilité de télécharger un fichier, qui sera stocké dans un répertoire de l'application, et l'emplacement stocké dans la base de données. De cette façon, il peut être affiché comme un fichier qui peut être téléchargé. Mais quelque chose que je remarque est qu'un fichier avec le même nom remplacera un fichier dans le répertoire des téléchargements. Il n'y a pas de message d'erreur et le nom de fichier n'est pas incrémenté. Donc je pense que le fichier doit être écrasé (ou jamais téléchargé).PHP: Stockage des emplacements de fichiers ... et si écrasé?

Quelles sont les meilleures pratiques que je devrais connaître lors du téléchargement, du déplacement ou du stockage de ces fichiers? Devrais-je toujours renommer les fichiers afin que le nom de fichier soit toujours unique?

Répondre

9

Généralement, nous ne stockons pas les fichiers avec le nom donné par l'utilisateur, mais en utilisant un nom que nous (c'est-à-dire notre application) chosse.

Par exemple, si un utilisateur télécharge my_file.pdf, nous aurions:

  • magasin une ligne dans le DB, contenant:
    • id; un auto-incrément, la clé primaire - "123", par exemple
    • le nom donné par l'utilisateur; donc nous pouvons envoyer le bon nom quand quelqu'un essaie de télécharger le fichier
    • le type de contenu du fichier; application/pdf ou quelque chose comme ça, par exemple.
    • « notre » nom: file-123 par exemple
  • quand il y a une demande au fichier avec id=123, nous savons quel fichier physique devrait être tiré par les cheveux ('file-' . $id) et envoyé.
  • et nous pouvons mettre une tête pour envoyer à corriger le nom « logique » dans le navigateur, en utilisant le nom que nous stockons dans le DB, pour la « Enregistrer sous » boîte de dialogue
  • même pour le type de contenu, btw

de cette façon, nous nous assurons:

  • qu'aucun fichier n'a aucun nom « mauvais », comme nous sommes ceux qui choisissent, et non pas le client
  • qu'il n'y a pas écrasant: comme nos noms de fichiers incluent la clé primaire de notre table, ces noms de fichiers sont uniques
+0

bonne réponse, merci! – Andrew

+0

@Andrew: vous êtes les bienvenus :-) Amusez-vous! –

+0

doux et parfait merci Pascal! +1 –

0

Oui, vous devez trouver un moyen de les nommer uniquement. J'ai vu toutes sortes de stratégies différentes allant d'une base de hachage sur le nom de fichier orignal, pk de l'enregistrement db et l'horodatage de téléchargement, à un certain type de slugging, toujours basé sur varous champs dans l'enregistrement db ses dossiers attachés ou connexes.

1

Continuant sur la réponse de Pascal MARTIN:

Si vous utilisez un identifiant comme nom, vous pouvez également trouver une stratégie de nommage de répertoire.Je ne prend plus de /somedir/part1ofID/part2OfID à partir du système de fichiers que /somedir/theWholeID, mais il vous permettra de choisir combien de fichiers sont stockés dans le même répertoire à partir de la façon dont vous divisez l'ID pour former le chemin et le nom de fichier. La prochaine bonne chose est que le script que vous utilisez pour réellement sortir le fichier à l'utilisateur peut choisir si l'utilisateur est autorisé à voir le fichier ou non. Cela nécessite bien sûr que les fichiers soient stockés quelque part non lisibles par tout le monde par défaut.

Vous pouvez également regarder this other question. Pas totalement lié, mais bon à savoir.

+1

Si vous voulez "continuer" ou ajouter à la réponse de quelqu'un, utilisez un commentaire sur sa réponse, et ne le postez pas comme réponse. Surtout parce que s'il y a beaucoup de réponses, votre message ne sera pas à côté de celui que vous ajoutez. – TravisO

+0

Ouais, c'était aussi mon idée au début. J'ai juste l'impression que la boîte de commentaires est un peu limitée pour ajouter des réponses longues. Que me suggérez-vous de faire, d'enlever ma réponse et de l'ajouter comme commentaire, ou d'ajouter plus de contexte à ma réponse? –