0
Base64로 인코딩 된 스크린 샷을 .png로 저장하는 다음 코드가 있습니다.Django FileField 용 파일을 작성하는 방법 - 중복 파일을 방지하는 방법
class SupportTicketForm(forms.ModelForm):
class Meta:
model = SupportTicket
fields = ('message',
'created_by',
'modified_by')
def __init__(self, *args, **kwargs):
try:
self.img_data_base64 = kwargs.pop('img_data_base64')
except KeyError, e:
raise ImproperlyConfigured('SupportTicket was not properly instantiated. The following keyword argument is missing: %s:' %(e))
super(SupportTicketForm, self).__init__(*args, **kwargs)
def save(self, force_insert=False, force_update=False, commit=True):
ticket = super(SupportTicketForm, self).save(commit=False)
date_now = datetime.utcnow().replace(tzinfo=utc)
#dummy-name will be set to unique name in upload handler in models.py
filename = "dummy-name.png"
fh = open(filename, 'w+b')
img_file = File(fh)
img_file.write(self.img_data_base64.decode('base64'))
ticket.ticket_img.save(filename, img_file)
fh.close()
if commit:
ticket.save()
return ticket
모델은 다음과 같습니다
def support_ticket_path_handler(instance, filename):
year = datetime.now().year
month = datetime.now().month
ext = filename.split('.')[-1]
#rename filename - create random + unique filename
filename = "%s.%s" % (uuid.uuid4(), ext)
path_return = "support/tickets/{year}/{month}/{file}".format(year=year,
month=month,
file=filename)
return path_return
support_ticket_storage = FileSystemStorage()
class SupportTicket(models.Model):
"""user created support tickets"""
INITIAL_STATUS = 0
IN_PROGRESS_STATUS = 1
RESOLVED_STATUS = 2
DEFAULT_STATUS_CHOICES = (
(INITIAL_STATUS, 'New Ticket'),
(IN_PROGRESS_STATUS, 'In Progress'),
(RESOLVED_STATUS, 'Resolved'),
)
message = models.CharField(max_length=100, default="")
ticket_img = models.FileField(storage=support_ticket_storage,
upload_to=support_ticket_path_handler,
blank=False)
내 문제는 형태의 코드() 메소드가 디스크에 두 개의 파일을 만들어 저장할 수 있다는 것입니다. 하나의 파일 이름이 "dummy-name.png"
이고 하나의 파일 이름이 support_ticket_path_handler
에 정의되어 있습니다. 반면 두 번째 파일은 필요합니다.
Django File 개체에 대한 파이썬 이미지 파일 핸들이 필요하므로 첫 번째 이미지를 만드는 것을 방지하는 방법을 알지 못합니다. 옵션은 나중에 첫 번째 이미지를 지우는 것이지만, 저에게는 매우 깨끗해 보이지 않습니다.