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


안녕하세요. 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
  • 2016년 07월 11일에 작성됨

조회수 231


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close