Qual è il modo migliore per rinominare le foto con un nome file univoco sul server mentre vengono caricate, usando django? Voglio assicurarmi che ogni nome venga usato una sola volta. Esistono app per il pinax che possono farlo, forse con GUID?Applicare nomi di file di caricamento univoci utilizzando django?
risposta
Utilizzare uuid. Per legarlo al modello, vedi Django documentation per FileField upload_to.
Ad esempio nella tua models.py definire la seguente funzione:
import uuid
import os
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join('uploads/logos', filename)
Poi, al momento di definire il tuo FileField/ImageField, specificare get_file_path
come valore upload_to
.
file = models.FileField(upload_to=get_file_path,
null=True,
blank=True,
verbose_name=_(u'Contact list'))
Questa è una decisione sbagliata per farlo in questo modo, poiché avrai una migrazione infinita su questi campi, poiché in ogni migrazione avrai un percorso di caricamento diverso. –
@Creotiv Questo non sta cambiando il percorso di upload, sta sostituendo il nome file con un UUID. Questo non dovrebbe causare problemi di migrazione. – Hybrid
@Hybrid Sì, ma a ogni migrazione, il percorso della directory sarà diverso, quindi il sistema di migrazione penserà che quel campo sia cambiato. –
Come concatenare il nome file con la data/ora in cui è stata caricata la foto e quindi utilizzare hashlib per creare un digest di messaggi? Questo dovrebbe darti nomi di file unici.
In alternativa è possibile riutilizzare a neat little snippet che crea nomi di file univoci e quindi utilizzare il percorso completo del file come input per la chiamata hash. Questo ti dà stringhe di lunghezza costante uniche che puoi mappare ai tuoi file.
ma, come fare lo stesso nome quando è la stessa ora? – zjm1126
È possibile aggiungere la quantità di spazio libero su disco nella stringa hash, che dovrebbe sempre cambiare quando si carica un nuovo file. –
@ zjm1126 @Jon Cage potresti inventare ogni sorta di modi per renderlo più probabile che sia unico e tale, ma fondamentalmente ci sarà sempre una sorta di probabilità di collisioni e l'idea è solo quella di ridurre tale probabilità ad un ammontare accettabile e poi gestire quando succede –
Prima di Django 1.6.6, 1.5.9 e 1.4.14, la funzione get_avaialable_name
assegnava automaticamente ai file un nome univoco aggiungendo un carattere di sottolineatura. Quindi, per esempio, se salvi un file "test.jpg" e poi un altro file, "test.jpg" sul tuo server, il primo sarà chiamato test.jpg, e il secondo sarà chiamato test_1.jpg.
Alas, che risulta essere un vettore per il DDOS di una macchina, inviandogli migliaia di file a zero byte da archiviare, ognuno dei quali controlla migliaia di file precedenti per vedere quale dovrebbe essere il suo nome.
Come per il numero see in the docs, il nuovo sistema aggiunge sette cifre casuali dopo il trattino basso per risolvere il problema.
Un modo migliore potrebbe essere utilizzare una classe comune in helpers.py. In questo modo puoi riutilizzare il generatore di file casuali nelle tue app.
Nel vostro helpers.py:
import os
import uuid
from django.utils.deconstruct import deconstructible
@deconstructible
class RandomFileName(object):
def __init__(self, path):
self.path = os.path.join(path, "%s%s")
def __call__(self, _, filename):
# @note It's up to the validators to check if it's the correct file type in name or if one even exist.
extension = os.path.splitext(filename)[1]
return self.path % (uuid.uuid4(), extension)
E poi nel modello solo importare la classe helper:
from mymodule.helpers import RandomFileName
E poi usarlo:
logo = models.ImageField(upload_to=RandomFileName('logos'))
Rif: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites
Al momento della stesura di questa risposta sembra che non sia più necessario fare qualcosa di speciale per far sì che ciò accada. Se imposti un FileField con una proprietà upload_to statica, il sistema di archiviazione Django gestirà automaticamente i nomi in modo tale che se viene caricato un nome file duplicato, Django genererà casualmente un nuovo nome file univoco per il duplicato.
Lavori su Django 1.10.
- 1. caricare immagini tramite php utilizzando nomi di file univoci
- 2. Assegnare nomi univoci ai file durante il caricamento
- 3. Come applicare vincoli univoci usando l'annotazione
- 4. Django: test di caricamento riuscito di file statici
- 5. Caricamento file utilizzando RichFaces
- 6. Barra di avanzamento caricamento file utilizzando RestTemplate.postForLocation
- 7. caricamento di più file utilizzando formdata()
- 8. UnicodeEncodeError durante il caricamento di file nell'amministratore di Django
- 9. Richiesta di caricamento del modulo di Django. File vuoto
- 10. Caricamento di file di grandi dimensioni con Python/Django
- 11. TipoErrore caricamento di file di immagine su Amazon S3 in Django utilizzando la libreria BOTO
- 12. perché le librerie di clojure non tentano di utilizzare nomi univoci per nomi di funzioni comuni
- 13. Modelli Jquery - JSON annidato (nomi di chiavi univoci)
- 14. Caricamento file asincrono (caricamento file AJAX) utilizzando jsp e javascript
- 15. Dividere nomi file utilizzando il simbolo separatore file di sistema
- 16. Caricamento di file in blocchi utilizzando il plug-in di caricamento del file jquery in JAVA
- 17. Caricamento di più immagini nell'amministratore di Django
- 18. django-crispy-forms per il caricamento di file jasny
- 19. Recupero nomi dei file da un controllo di caricamento di più file con javascript
- 20. Rendere ESLint applicare le regole solo a determinati modelli di nomi di file
- 21. utilizzando il nome del testcase nei nomi file di output
- 22. problema di caricamento file
- 23. Caricamento fallito in PHP utilizzando la barra di avanzamento caricamento file jQuery di Malsup
- 24. Caricamento di un file utilizzando Ruby SDK su Amazon S3
- 25. Caricamento di un file da AVCapture utilizzando AFNetworking
- 26. Caricamento di file utilizzando AJAX senza FormData (IE9)
- 27. Caricamento di dati dal file excel al database utilizzando java
- 28. Errore durante il caricamento di un file utilizzando Retrofit 2
- 29. caricamento file utilizzando jquery ajax e gestore di asp.net
- 30. Come convalidare un campo di caricamento file utilizzando Javascript/jquery
Hai bisogno di una libreria di python per rinominare i file, quindi sono unici? – Aurril
sì, è la mia media – zjm1126