Soru Django kullanarak benzersiz yükleme dosya adlarını zorla?


Fotoğrafları, yüklendikleri sırada sunucudaki benzersiz bir dosya adıyla yeniden adlandırmanın en iyi yolu nedir? Her ismin sadece bir kez kullanıldığından emin olmak istiyorum. Bunu, belki de GUID ile yapabileceğiniz pinax uygulamaları var mı?


44
2018-04-20 08:30


Menşei


Dosyaları yeniden adlandırmak için bir python libary'ye ihtiyacınız var, bu yüzden benzersiz mi? - Aurril
evet, benim demek istediğim - zjm1126


Cevaplar:


Uuid kullan. Bunu modelinize bağlamak için bkz. Django belgeleri FileField için upload_to.

Örneğin, models.py modelinizde aşağıdaki işlevi tanımlayın:

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)

Ardından, FileField / ImageField'ınızı tanımlarken get_file_path olarak upload_to değer.

file = models.FileField(upload_to=get_file_path,
                        null=True,
                        blank=True,
                        verbose_name=_(u'Contact list'))

116
2018-04-20 18:00



Bu, böyle yapmak için kötü bir karardır, çünkü bu alanlarda sonsuz bir geçişe sahip olursunuz, her göçte farklı yükleme yollarına sahip olursunuz. - Andrey Nikishaev
@Creotiv Bu, yükleme yolunu değiştirmiyor, dosya adını bir UUID ile değiştiriyor. Bu herhangi bir göç sorununa neden olmamalıdır. - Hybrid
@Hybrid Evet, ancak her geçişte dizin yolu farklı olacak, bu nedenle geçiş sistemi bu alanın değişeceğini düşünecek. - Andrey Nikishaev
@Creotiv - no, geçişler yalnızca izleme Nasıl dosya adı oluşturuluyor. Bu, göçlerin bir işlev olduğunu bildiği anlamına gelir get_file_path Kullanılan. Eğer upload_to=uuid4() Kullanıldığını belirttiğiniz sorunun oluştuğu durum böyle olurdu. - orokusaki
alma NameError: name 'get_file_path' is not defined :( - NoobEditor


Django 1.6.6, 1.5.9 ve 1.4.14'ten önce get_avaialable_name işlev, altçizgi ekleyerek dosyalara otomatik olarak benzersiz bir ad verir. Yani, örneğin, bir dosya "test.jpg" ve sonra başka bir dosya, "test.jpg" sunucunuza kaydederseniz, ilk test.jpg denir ve ikincisi test_1.jpg olarak adlandırılır.

Ne yazık ki, bu bir makine DDOSing için bir vektör olduğu ortaya çıkıyor, binlerce sıfır bayt dosyaları saklamak için göndererek, her biri önceki dosyaların binlerce olması gerektiğini kontrol etmek için ismini görmek gerekiyor.

Senin gibi dokümanlar bakınYeni sistem, bu sorunu gidermek için alt çizgi sonrası yedi rastgele rakam ekler.


5
2018-04-20 16:26





Daha iyi bir yol, helpers.py dosyanızda ortak bir sınıf kullanıyor olabilir. Bu şekilde, rastgele dosya oluşturucuyu uygulamalarınızda yeniden kullanabilirsiniz.

Helpers.py’inizde:

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)

Ve sonra modelinizde yardımcı sınıfı içe aktarın:

from mymodule.helpers import RandomFileName 

Ve sonra onu kullanın:

logo = models.ImageField(upload_to=RandomFileName('logos'))

Ref: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites


5
2017-10-24 00:38





Fotoğrafın yüklendiği tarih / saat ile dosya adını birleştirmeye ve ardından hashlib bir mesaj özeti oluşturmak için? Bu size benzersiz dosya isimleri vermeli.

Alternatif olarak yeniden kullanabilirsiniz düzgün bir küçük snippet hangi benzersiz dosya isimleri oluşturur ve sonra o dosyanın tam yolunu hash çağrısı için girdi olarak kullanır. Bu, dosyalarınıza eşleyebileceğiniz benzersiz sabit uzunluklu dizeler sağlar.


0
2018-04-20 09:08



ama aynı zamanda aynı adı nasıl? - zjm1126
Boş disk alanı miktarını hash dizesine ekleyebilirsiniz - yeni bir dosya yüklediğinizde her zaman değişmesi gerekir. - Jon Cage
@ zjm1126 @Jon Cage, benzersiz olmanın daha muhtemel olmasını sağlamanın her türlü yolunu bulabilirsin, ama temelde her zaman bir çeşit çarpışma olasılığı olacak ve bu fikir sadece o olasılığı kabul edilebilir bir miktara indirgeyecek ve ne zaman olursa - Daniel DiPaolo
Aslında. Gerçekten bağlı olduğum pasaj, benzersiz olurdu; dosya sistemi, aynı ada sahip sadece bir dosyanın oluşturulabileceğini düşünebilirdi. Yani bunun tam yolunda bir yaratma oldukça iyi olmalı. - Jon Cage


Bu cevabın yazılmasından dolayı, bunun gerçekleşmesi için özel bir şey yapmaya artık gerek yok gibi görünüyor. Statik bir upload_to özelliğine sahip bir FileField kurarsanız, Django depolama sistemi adlandırma işlemini otomatik olarak yönetir, böylece bir çift dosya adı yüklenirse, Django iki kopya için rastgele yeni bir benzersiz dosya adı oluşturur.

Django 1.10 üzerinde çalışıyor.


0
2018-04-10 17:50