· 7 years ago · Oct 13, 2018, 03:54 PM
1# -*- coding: utf-8 -*-
2import os, time, random
3from django.core.files.base import File
4from django.core.files.storage import Storage
5from django.conf import settings
6from django.core.files import File
7import sae.storage
8try:
9 from cStringIO import StringIO
10except ImportError:
11 from StringIO import StringIO
12
13class SaeStorage(Storage):
14
15 def __init__(self, location="base"
16 #accesskey=settings.ACCESS_KEY,
17 #secretkey=settings.SECRET_KEY,
18 #prefix=settings.APP_NAME
19 #media_root=settings.MEDIA_ROOT,
20 #media_url=settings.MEDIA_URL,
21 ):
22 #self.accesskey = accesskey
23 #self.secretkey = secretkey
24 #self.prefix = prefix
25 #self.media_root = media_root
26 #self.media_url = media_url
27
28 #self.client = sae.storage.Client(accesskey, secretkey, prefix)
29 self.prefix = location
30 self.client = sae.storage.Client()
31
32
33 def _put_file(self, name, content):
34 ob = sae.storage.Object(content)
35 self.client.put(self.prefix, name, ob)
36
37 def _read(self, name):
38 memory_file = StringIO()
39 try:
40 o = self.client.get(self.prefix, name)
41 memory_file.write(o.data)
42 except sae.storage.ObjectNotExistsError, e:
43 pass
44 return memory_file
45
46 def _open(self, name, mode="rb"):
47 return SaeStorageFile(name, self, mode=mode)
48
49 def _save(self, name, content):
50 content.open()
51 if hasattr(content, 'chunks'):
52 content_str = ''.join(chunk for chunk in content.chunks())
53 else:
54 content_str = content.read()
55 self._put_file(name, content_str)
56 content.close()
57 return name
58
59 def delete(self, name):
60 self.client.delete(self.prefix, name)
61
62 def exists(self, name):
63 try:
64 o = self.client.stat(self.prefix, name)
65 except sae.storage.ObjectNotExistsError, e:
66 return False
67 return True
68
69 def listdir(self,domain):
70 files = self.client.list(domain)
71 return ((),files)
72
73 def size(self, name):
74 try:
75 stat = self.client.stat(self.prefix, name)
76 except sae.storage.ObjectNotExistsError, e:
77 return 0
78 return stat.length
79
80 def url(self, name):
81 return self.client.url(self.prefix, name)
82
83class SaeStorageFile(File):
84 """docstring for SaeStorageFile"""
85 def __init__(self, name, storage, mode):
86 self._name = name
87 self._storage = storage
88 self._mode = mode
89 self._is_dirty = False
90 self.file = StringIO()
91 self._is_read = False
92
93 @property
94 def size(self):
95 if not hasattr(self, '_size'):
96 self._size = self._storage.size(self._name)
97 return self._size
98
99 def read(self):
100 if not self._is_read:
101 self.file = self._storage._read(self._name)
102 self._is_read = True
103 return self.file.getvalue()
104
105 def write(self, content):
106 if 'w' not in self._mode:
107 raise AttributeError("File was opened for read-only access.")
108 self.file = StringIO(content)
109 self._is_dirty = True
110 self._is_read = True
111
112 def close(self):
113 if self._is_dirty:
114 self._storage._put_file(self._name, self.file.getvalue())
115 self.file.close()