[Django] url link를 이용하여 File을 FileField에 저장하는 방법?

조회수 2269회

안녕하세요. Slack에 있는 파일을 자체 서버에 저장하기 위해서 Django를 이용하고자 합니다. 먼저 slakc api를 통해 slack 방에 있는 모든 파일 리스트들을 불러오는데 성공했고, 다운로드 링크까지 들어오는걸 확인했습니다. 이 다운로드 링크를 직접 들어갔을 때 파일이 정상적으로 자동으로 다운로드 되는것도 확인했습니다.

Django에서 인스턴스가 생성시 생성된 인스턴스의 다운로드 링크를 이용해 FileField 안에 직접 저장할려고 하니 파일이 깨진 상태로 저장되고 있습니다. 파일 형식은 jpg부터 해서 pdf, ppt까지 다양하게 있습니다.

urllib2 말고 urllib을 이용한 방법을 사용해도 결과는 마찬가지네요... 혹시 제가 놓친 부분이 있을까요?

def get_slack_file():
    slack = Slacker('...')

    r = slack.files.list()

    for item in r.body['files']:
        instance, created = SlackFile.objects.get_or_create(
            name=item['name'],
            downloadUrl=item['url_private_download'],
            fileType=item['filetype'],
            size=item['size'],
            timestamp=item['timestamp'],
            user=item['user'],
            channels=item['channels']
        )

        if created:
            //여기까지는 정상적으로 작동
            if instance.downloadUrl and not instance.file:
                //instance.downloadUrl을 이용하여 FileFiled에 저장하는 부분이 실패
                file_temp = NamedTemporaryFile(delete=True)
                file_temp.write(urllib2.urlopen(instance.downloadUrl).read())
                file_temp.flush()

                instance.file.save(
                    instance.name, File(file_temp)
                )
                instance.save()
//models.py
def download_file_location(instance, filename):
    return "slack/%s/%s" % (instance, filename)

class SlackFile(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    downloadUrl = models.URLField()
    fileType = models.CharField(max_length=30, null=True, blank=True)
    file = models.FileField(
        blank=True,
        null=True,
        upload_to=download_file_location
    )
    size = models.PositiveIntegerField(default=0)
    timestamp = models.CharField(max_length=120, null=True, blank=True)
    user = models.CharField(max_length=30, null=True, blank=True)
    channels = models.CharField(max_length=30, null=True, blank=True)

    def __unicode__(self):
        return self.name

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)