सवाल Django का उपयोग कर अद्वितीय अपलोड फ़ाइल नाम लागू करें?


सर्वर पर एक अद्वितीय फ़ाइल नाम के साथ फोटो का नाम बदलने के लिए सबसे अच्छा तरीका क्या है, जिसे वे अपलोड कर रहे हैं, django का उपयोग कर? मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक नाम केवल एक बार उपयोग किया जाए। क्या कोई पिनएक्स ऐप है जो शायद यह कर सकता है, शायद GUID के साथ?


44
2018-04-20 08:30


मूल


फाइलों का नाम बदलने के लिए आपको एक पायथन मुक्ति की ज़रूरत है, इसलिए वे अद्वितीय हैं? - Aurril
हाँ, यह मेरा मतलब है - zjm1126


जवाब:


यूयूआईडी का प्रयोग करें। अपने मॉडल में इसे बांधने के लिए Django दस्तावेज FileField upload_to के लिए।

उदाहरण के लिए आपके models.py में निम्नलिखित फ़ंक्शन को परिभाषित करें:

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)

फिर, जब आप अपनी फ़ाइल फ़ील्ड / छवि फ़ील्ड को परिभाषित करते हैं, तो निर्दिष्ट करें get_file_path के रूप में upload_to मूल्य।

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

116
2018-04-20 18:00



इसे ऐसा करने का बुरा निर्णय है, क्योंकि आपके पास इस फ़ील्ड पर अनंत प्रवास होगा, प्रत्येक प्रवासन के कारण आपके पास अलग-अलग अपलोड पथ होंगे। - Andrey Nikishaev
@ क्रेओटिव यह अपलोड पथ नहीं बदल रहा है, यह फ़ाइल नाम को यूयूआईडी के साथ बदल रहा है। इससे कोई माइग्रेशन समस्या नहीं होनी चाहिए। - Hybrid
@ हाइब्रिड हाँ, लेकिन हर माइग्रेशन पर, निर्देशिका पथ अलग होगा, इसलिए माइग्रेशन सिस्टम को लगता है कि फ़ील्ड बदल गया है। - Andrey Nikishaev
@ क्रोटिव - नहीं, माइग्रेशन केवल ट्रैकिंग है किस तरह फ़ाइल नाम उत्पन्न किया जा रहा है। इसका मतलब है कि माइग्रेशन जानता है कि एक समारोह कहा जाता है get_file_path उपयोग किया जा रहा है। अगर upload_to=uuid4() इस्तेमाल किया गया था, यह वह मामला होगा जहां आप जिस समस्या का सामना कर रहे हैं वह खेल में आता है। - orokusaki
मिल रहा NameError: name 'get_file_path' is not defined :( - NoobEditor


Django 1.6.6, 1.5.9, और 1.4.14 से पहले, get_avaialable_name फ़ंक्शन स्वचालित रूप से अंडरस्कोर जोड़कर फ़ाइलों को एक अद्वितीय नाम देगा। तो, उदाहरण के लिए, यदि आप एक फ़ाइल "test.jpg" और फिर दूसरी फ़ाइल, "test.jpg" को अपने सर्वर पर सहेजते हैं, तो पहले test.jpg कहा जाएगा, और दूसरा test_1.jpg कहा जाएगा।

हां, यह एक मशीन को डीडीओएसिंग के लिए एक वेक्टर बन गया है, इसे हजारों शून्य-बाइट फाइलों को स्टोर करने के लिए भेजकर, हर कोई हजारों पिछली फाइलों को देखता है ताकि यह देखने के लिए कि उसका नाम क्या होना चाहिए।

जैसा आप करेंगे दस्तावेज़ों में देखें, इस समस्या को ठीक करने के लिए अंडरस्कोर के बाद नई प्रणाली सात यादृच्छिक अंक जोड़ती है।


5
2018-04-20 16:26





एक बेहतर तरीका आपके helpers.py में एक सामान्य वर्ग का उपयोग कर सकता है। इस तरह आप अपने ऐप्स में यादृच्छिक फ़ाइल जनरेटर का पुन: उपयोग कर सकते हैं।

आपके 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)

और फिर अपने मॉडल में केवल सहायक वर्ग आयात करें:

from mymodule.helpers import RandomFileName 

और फिर इसका इस्तेमाल करें:

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

रेफरी: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites


5
2017-10-24 00:38





फ़ाइल अपलोड किए जाने की तिथि / समय के साथ फ़ाइल नाम को सम्मिलित करने और फिर उपयोग करने के बारे में hashlib एक संदेश पचाने के लिए? आपको अद्वितीय फाइलनाम देना चाहिए।

वैकल्पिक रूप से आप फिर से उपयोग कर सकते हैं एक साफ छोटा स्निपेट जो अद्वितीय फ़ाइल नाम बनाता है और उसके बाद उस फ़ाइल के पूर्ण पथ का उपयोग अपने हैश कॉल में इनपुट के रूप में करता है। यह आपको अद्वितीय निरंतर लंबाई तार देता है जिसे आप अपनी फाइलों में मैप कर सकते हैं।


0
2018-04-20 09:08



लेकिन, एक ही समय में एक ही नाम कैसे करें? - zjm1126
आप हैश स्ट्रिंग में फ्री डिस्क स्पेस की मात्रा जोड़ सकते हैं - जब आप एक नई फ़ाइल अपलोड करते हैं तो हमेशा बदलना चाहिए। - Jon Cage
@ zjm1126 @ जोन केज आप अनूठे होने की अधिक संभावना बनाने के सभी तरीकों का आविष्कार कर सकते हैं और ऐसे में मूल रूप से टकराव की संभावना कुछ हो सकती है और विचार केवल स्वीकार्य राशि की संभावना को कम करने और फिर संभालने के लिए है जब ऐसा होता है - Daniel DiPaolo
वास्तव में। स्निपेट जो मैं वास्तव में जुड़ा हुआ हूं वह अद्वितीय होगा; फाइल सिस्टम garauntee होगा कि एक ही नाम के साथ केवल एक फ़ाइल बनाई जा सकती है। तो उस के पूर्ण पथ पर एक बनाना बहुत अच्छा होना चाहिए। - Jon Cage


इस जवाब के लेखन के रूप में ऐसा लगता है कि ऐसा करने के लिए आपको अब कुछ विशेष करने की आवश्यकता नहीं है। यदि आप एक स्थिर अपलोड_to संपत्ति के साथ फ़ाइलफाइल सेट अप करते हैं, तो Django स्टोरेज सिस्टम स्वचालित रूप से नामकरण का प्रबंधन करेगा ताकि यदि डुप्लिकेट फ़ाइल नाम अपलोड किया गया हो, तो Django डुप्लिकेट के लिए यादृच्छिक रूप से एक नया अद्वितीय फ़ाइल नाम उत्पन्न करेगा।

Django 1.10 पर काम करता है।


0
2018-04-10 17:50