Django vous donne un contrôle total sur l'endroit où (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:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['file'].name
# create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(BASE_PATH, folder))
except:
pass
# save the uploaded file inside that folder.
full_filename = os.path.join(BASE_PATH, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
# Iterate through the chunks.
for chunk in fout.chunks():
fout.write(chunk)
fout.close()
Edit: Comment faire cela avec un FileUploadHandler? Il remonte à travers le code et il semble que vous devez faire quatre choses pour reformater le TemporaryFileUploadHandler pour sauver l'extérieur de FILE_UPLOAD_TEMP_DIR:
étendre TemporaryUploadedFile et passer outre initialisation() pour passer à travers un répertoire différent de NamedTemporaryFile . Il peut utiliser le try mkdir sauf pour le passage que j'ai montré ci-dessus.
étendez TemporaryFileUploadHandler et remplacez new_file() pour utiliser la classe ci-dessus.
également étendre init() pour accepter le répertoire dans lequel vous souhaitez que le dossier à aller.
ajouter le gestionnaire Dynamiquement de demande, en passant par un répertoire déterminé à partir de l'URL:
request.upload_handlers = [ProgressBarUploadHandler (request.path.replace ('/', '_')]
Bien que non-trivial, il est encore plus facile que d'écrire un gestionnaire à partir de zéro: En particulier, vous ne devez écrire une seule ligne de lecture en mémoire tampon sujettes à erreur les étapes 3 et 4 sont nécessaires parce que FileUploadHandlers ne sont pas demande passés. informations par défaut, je crois, donc vous devrez le dire séparément si vous voulez utiliser l'URL d'une manière ou d'une autre
Je ne peux pas vraiment recommander d'écrire un FileUploadHandler personnalisé pour cela. C'est vraiment mélanger les couches de responsabilité. Relativement à la vitesse de téléchargement d'un fichier sur Internet, faire une copie de fichier local est insignifiant. Et si le fichier est petit, Django le gardera en mémoire sans l'écrire dans un fichier temporaire. J'ai le mauvais pressentiment que tout fonctionnera et que vous ne pourrez même pas mesurer la différence de performance.
le déplacement du fichier temporaire est ok.Django vérifie ce cas et ne se plaint pas s'il disparaît: http://code.djangoproject.com/browser/django/trunk/django/core/files/uploadedfile.py#L57 – olooney