2013-10-16 2 views
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 개체에 대한 파이썬 이미지 파일 핸들이 필요하므로 첫 번째 이미지를 만드는 것을 방지하는 방법을 알지 못합니다. 옵션은 나중에 첫 번째 이미지를 지우는 것이지만, 저에게는 매우 깨끗해 보이지 않습니다.

답변

2

사용을 대신 StringIO :

from StringIO import StringIO 
import base64 

data = StringIO(base64.decodestring(self.img_data_base64)) 
img_file = File(data) 
ticket.ticket_img.save(filename, img_file) 

StringIO 취급 데이터가 메모리에 보관하면서 파일 인 것처럼.

관련 문제