Skip to content

Instantly share code, notes, and snippets.

@chenchiyuan
Forked from tyrchen/gist:2594784
Created September 7, 2012 09:13
Show Gist options
  • Select an option

  • Save chenchiyuan/3664536 to your computer and use it in GitHub Desktop.

Select an option

Save chenchiyuan/3664536 to your computer and use it in GitHub Desktop.

Revisions

  1. chenchiyuan revised this gist Sep 7, 2012. 1 changed file with 27 additions and 2 deletions.
    29 changes: 27 additions & 2 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,31 @@
    # regist by chenchiyuan, chenchiyuan03@gmail.com, Upyun python sdk, storage for django.
    # UpYun storage for django, written by Tyr Chen @ tukeq.com
    # to run this gist you need to get upyun python sdk first.

    # Waring: need to force name str, so in UpYunStorage _save, name = to_str(name).
    # Implement django file storage.

    class Photo(models.Model):
    name = models.CharField(_('图片名'), max_length=64, help_text=_(''), unique=True)
    filename = UpYunFileField(verbose_name = _('文件名'), help_text=_(''))

    @classmethod
    def create(cls, data, name):
    photo = cls(name=name)
    photo.filename.save(
    name, ContentFile(data), save=False
    )
    photo.save()

    def test():
    import urllib2
    url_path = 'http://...test.jpg'
    image = urllib2.open(url_path)
    data = image.read()
    Photo.create('test', data)



    # upyun storage
    class UpYunStorage(Storage):
    def __init__(self, bucket=settings.UPYUN_BUCKET):
    @@ -33,6 +58,7 @@ def close(self):
    return UpYunFile(name, self.upyun)

    def _save(self, name, content):
    name = to_str(name)
    self.upyun.writeFile(name, content)
    return name

    @@ -80,8 +106,7 @@ class UpYunFileField(models.FileField):
    def __init__(self, bucket=settings.UPYUN_BUCKET, verbose_name=None, name=None, upload_to='', **kwargs):
    storage = set_storage(bucket)
    upload_to = set_upload_to(upload_to)
    super(UpYunFileField, self).__init__(verbose_name, name, upload_to, storage, **kwargs)

    super(UpYunFileField, self).__init__(verbose_name, name, upload_to, storage, **kwargs)

    # usage:
    # just add UpYunFileField into your model, and the storage will do the magic. You need to setup several consts in settings to make UpYun storage
  2. @tyrchen tyrchen created this gist May 4, 2012.
    88 changes: 88 additions & 0 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    # UpYun storage for django, written by Tyr Chen @ tukeq.com
    # to run this gist you need to get upyun python sdk first.

    # upyun storage
    class UpYunStorage(Storage):
    def __init__(self, bucket=settings.UPYUN_BUCKET):
    self.upyun = UpYun(bucket, settings.UPYUN_USERNAME, settings.UPYUN_PASSWORD)
    self.upyun.setApiDomain(settings.UPYUN_API_DOMAIN)
    self.binding_domain = settings.UPYUN_BINDING_DOMAIN


    def _open(self, name, mode='rb'):
    class UpYunFile(File):
    def __init__(self, name, upyun):
    self.name = name
    self.upyun = upyun

    def size(self):
    info = self.upyun.getFileInfo(name)
    if info:
    return info['size']
    return 0

    def read(self, *args, **kwargs):
    return self.upyun.readFile(self.name)

    def write(self, data):
    return self.upyun.writeFile(self.name, data)

    def close(self):
    return

    return UpYunFile(name, self.upyun)

    def _save(self, name, content):
    self.upyun.writeFile(name, content)
    return name

    def delete(self, name):
    self.upyun.deleteFile(name)

    def exists(self, name):
    return self.upyun.getFileInfo(name) != None

    def listdir(self, path):
    return [d.filename for d in self.upyun.readDir(path)]

    def path(self, name):
    raise NotImplementedError

    def size(self, name):
    info = self.upyun.getFileInfo(name)
    if info:
    return int(info['size'])
    return 0

    def url(self, name):
    return urljoin(self.binding_domain, name)

    def get_available_name(self, name):
    return name


    def get_upload_to(instance, filename):
    import os, uuid
    return '%s%s' % (uuid.uuid4().hex, os.path.splitext(filename)[1])

    def set_storage(bucket):
    if settings.USE_UPYUN:
    return UpYunStorage(bucket)
    return None

    def set_upload_to(upload_to=''):
    if not upload_to:
    return get_upload_to
    return upload_to


    class UpYunFileField(models.FileField):
    def __init__(self, bucket=settings.UPYUN_BUCKET, verbose_name=None, name=None, upload_to='', **kwargs):
    storage = set_storage(bucket)
    upload_to = set_upload_to(upload_to)
    super(UpYunFileField, self).__init__(verbose_name, name, upload_to, storage, **kwargs)


    # usage:
    # just add UpYunFileField into your model, and the storage will do the magic. You need to setup several consts in settings to make UpYun storage
    # work. Good luck.