Django télécharger le fichier dans le répertoire spécifique qui dépend de la POST URI
J'aimerais stocker les fichiers téléchargés dans un répertoire spécifique qui dépend de l'URI de la requête POST. Peut-être, j'aimerais aussi renommer le fichier en quelque chose de fixe (le nom du fichier d'entrée par exemple) j'ai donc un moyen facile de filtrer le système de fichiers, etc. et aussi pour éviter d'éventuels problèmes de sécurité.
Quelle est la meilleure façon de le faire dans Django?
Edit: je me dois de préciser que je serais intéresse de faire ce que le chargement d'un fichier de gestionnaire d'éviter d'écrire un gros fichier deux fois, le système de fichiers.
Edit2: je suppose que l'on peut tout 'mv' la tmp fichier vers un nouvel emplacement. C'est une opération pas cher si sur le même système de fichiers.
OriginalL'auteur kmt | 2010-02-16
Vous devez vous connecter pour publier un commentaire.
Django vous donne un contrôle total sur lorsque (et si) vous enregistrez des fichiers. Voir: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
L'exemple ci-dessous montre comment combiner l'URL et le nom du fichier téléchargé et écrire le fichier sur le disque:
Edit: Comment faire avec un FileUploadHandler? Il a retracé vers le bas dans le code et il semble que vous devez faire quatre choses à réutiliser le TemporaryFileUploadHandler pour enregistrer en dehors de FILE_UPLOAD_TEMP_DIR:
étendre TemporaryUploadedFile et remplacer init() pour passer à travers un répertoire différent pour NamedTemporaryFile. Il peut utiliser l'essayer mkdir sauf pour le passage que j'ai montré ci-dessus.
étendre TemporaryFileUploadHandler et remplacer new_file() pour utiliser la classe ci-dessus.
également étendre init() pour accepter le répertoire où vous souhaitez que le dossier pour aller.
Ajouter dynamiquement à la demande du gestionnaire, en passant par un répertoire déterminé à partir de l'URL:
demande.upload_handlers = [ProgressBarUploadHandler(requête.chemin d'accès.remplacer('/', '_')]
Tandis que les non-trivial, c'est toujours plus facile que d'écrire un gestionnaire à partir de zéro: En particulier, vous n'aurez pas à écrire une seule ligne de risque d'erreur de tampon de lecture. Les étapes 3 et 4 sont nécessaires parce que FileUploadHandlers ne sont pas transmis les informations de requête par défaut, je crois, de sorte que vous aurez à dire séparément si vous souhaitez utiliser l'URL en quelque sorte.
Je ne peux pas vraiment recommander l'écriture d'un personnalisé FileUploadHandler pour cela. C'est vraiment le mélange des couches de responsabilité. Par rapport à la vitesse de téléchargement d'un fichier sur internet, faire une copie du fichier local est insignifiant. Et si le fichier est petit, Django vais juste garder en mémoire, sans l'écrire, pour un fichier temp. J'ai un mauvais sentiment que vous obtiendrez tout ce travail et de trouver que vous ne pouvez pas même de mesurer la différence de performances.
Alright. Je vais prendre ce que réponse. J'ai été de penser le long des mêmes lignes, mais, étant très nouveau pour Django, je voulais vérifier avec quelqu'un. BTW, où la ProgressBarUploadHandler venir? Je suppose que, de copier-coller à partir de quelque part? Juste assez. J'apprécie l'effort de répondre à cette question.
Bien que, sur une seconde bien, j'avais vraiment envie un peu plus de discussion sur ce point. Par exemple, si les choses en django/core/files/storage.py être utilisé? Qu'est-ce que cela signifie?
le code ne fonctionne pas. Erreur:
AttributeError: 'file' object has no attribute 'chunks'
importer vos fichiers
from .forms import UploadFileForm
from somewhere import handle_uploaded_file
OriginalL'auteur olooney
Fixe olooney exemple. Il travaille maintenant
de django.de base.les fichiers.la base de l'importation ContentFile
OriginalL'auteur user2455668