class SFTPStorageFile(File): def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self._is_read = False @property def size(self): if not hasattr(self, '_size'): self._size = self._storage.size(self._name) return self._size def read(self, num_bytes=None): if not self._is_read: self.file = self._storage._read(self._name) self._is_read = True return self.file.read(num_bytes) def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True self._is_read = True def close(self): if self._is_dirty: self._storage._save(self._name, self.file.getvalue()) self.file.close()
def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self._is_read = False
def read(self, num_bytes=None): if num_bytes is None: args = [] self.start_range = 0 else: args = [self.start_range, self.start_range + num_bytes - 1] data = self._storage._read(self._name, *args) self.file = BytesIO(data) return self.file.getvalue()
def _read(self, name): memory_file = BytesIO() try: pwd = self._connection.pwd() self._connection.cwd(os.path.dirname(name)) self._connection.retrbinary('RETR ' + os.path.basename(name), memory_file.write) self._connection.cwd(pwd) memory_file.seek(0) return memory_file except ftplib.all_errors: raise FTPStorageException('Error reading file %s' % name)
def _compress_content(self, content): """Gzip a given string content.""" zbuf = BytesIO() zfile = GzipFile(mode='wb', compresslevel=6, fileobj=zbuf) try: zfile.write(force_bytes(content.read())) finally: zfile.close() zbuf.seek(0) content.file = zbuf content.seek(0) return content
def _compress_content(self, content): """Gzip a given string content.""" zbuf = BytesIO() zfile = GzipFile(mode="wb", compresslevel=6, fileobj=zbuf) try: zfile.write(force_bytes(content.read())) finally: zfile.close() zbuf.seek(0) content.file = zbuf content.seek(0) return content
def _compress_content(self, content): """Gzip a given string content.""" zbuf = BytesIO() zfile = GzipFile(mode='wb', compresslevel=6, fileobj=zbuf) try: zfile.write(force_bytes(content.read())) finally: zfile.close() zbuf.seek(0) # Boto 2 returned the InMemoryUploadedFile with the file pointer replaced, # but Boto 3 seems to have issues with that. No need for fp.name in Boto3 # so just returning the BytesIO directly return zbuf
def __init__(self, name, storage, mode): self.name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self._is_read = False
def _compress_content(self, content): """Gzip a given string content.""" zbuf = BytesIO() # The GZIP header has a modification time attribute (see http://www.zlib.org/rfc-gzip.html) # This means each time a file is compressed it changes even if the other contents don't change # For S3 this defeats detection of changes using MD5 sums on gzipped files # Fixing the mtime at 0.0 at compression time avoids this problem zfile = GzipFile(mode='wb', compresslevel=6, fileobj=zbuf, mtime=0.0) try: zfile.write(force_bytes(content.read())) finally: zfile.close() zbuf.seek(0) content.file = zbuf content.seek(0) return content
def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self.start_range = 0
def _compress_content(self, content): """Gzip a given string content.""" zbuf = BytesIO() # The GZIP header has a modification time attribute (see http://www.zlib.org/rfc-gzip.html) # This means each time a file is compressed it changes even if the other contents don't change # For S3 this defeats detection of changes using MD5 sums on gzipped files # Fixing the mtime at 0.0 at compression time avoids this problem zfile = GzipFile(mode="wb", compresslevel=6, fileobj=zbuf, mtime=0.0) try: zfile.write(force_bytes(content.read())) finally: zfile.close() zbuf.seek(0) content.file = zbuf content.seek(0) return content
def _open(self, name, mode='rb'): """Open a file from database. @param name filename or relative path to file based on base_url. path should contain only "/", but not "\". Apache sends pathes with "/". If there is no such file in the db, returs None """ assert mode == 'rb', "You've tried to open binary file without specifying binary mode! You specified: %s"%mode row = self.cursor.execute("SELECT %s from %s where %s = '%s'"%(self.blob_column,self.db_table,self.fname_column,name) ).fetchone() if row is None: return None inMemFile = BytesIO(row[0]) inMemFile.name = name inMemFile.mode = mode retFile = File(inMemFile) return retFile
class CouchDBFile(File): """ CouchDBFile - a Django File-like class for CouchDB documents. """ def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False try: self._doc = self._storage.get_document(name) tmp, ext = os.path.split(name) if ext: filename = "content." + ext else: filename = "content" attachment = self._storage.db.get_attachment(self._doc, filename=filename) self.file = BytesIO(attachment) except couchdb.client.ResourceNotFound: if 'r' in self._mode: raise ValueError("The file cannot be reopened.") else: self.file = BytesIO() self._is_dirty = True @property def size(self): return self._doc['size'] def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True def close(self): if self._is_dirty: self._storage._put_file(self._name, self.file.getvalue()) self.file.close()
class LibCloudFile(File): """File inherited class for libcloud storage objects read and write""" def __init__(self, name, storage, mode): self.name = name self._storage = storage self._mode = mode self._is_dirty = False self._file = None def _get_file(self): if self._file is None: data = self._storage._read(self.name) self._file = BytesIO(data) return self._file def _set_file(self, value): self._file = value file = property(_get_file, _set_file) @property def size(self): if not hasattr(self, '_size'): self._size = self._storage.size(self.name) return self._size def read(self, num_bytes=None): return self.file.read(num_bytes) def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True def close(self): if self._is_dirty: self._storage._save(self.name, self.file) self.file.close()
def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False try: self._doc = self._storage.get_document(name) tmp, ext = os.path.split(name) if ext: filename = "content." + ext else: filename = "content" attachment = self._storage.db.get_attachment(self._doc, filename=filename) self.file = BytesIO(attachment) except couchdb.client.ResourceNotFound: if 'r' in self._mode: raise ValueError("The file cannot be reopened.") else: self.file = BytesIO() self._is_dirty = True
class LibCloudFile(File): """File inherited class for libcloud storage objects read and write""" def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self.start_range = 0 @property def size(self): if not hasattr(self, "_size"): self._size = self._storage.size(self._name) return self._size def read(self, num_bytes=None): if num_bytes is None: args = [] self.start_range = 0 else: args = [self.start_range, self.start_range + num_bytes - 1] data = self._storage._read(self._name, *args) self.file = BytesIO(data) return self.file.getvalue() def write(self, content): if "w" not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True def close(self): if self._is_dirty: self._storage._save(self._name, self.file) self.file.close()
class LibCloudFile(File): """File inherited class for libcloud storage objects read and write""" def __init__(self, name, storage, mode): self._name = name self._storage = storage self._mode = mode self._is_dirty = False self.file = BytesIO() self.start_range = 0 @property def size(self): if not hasattr(self, '_size'): self._size = self._storage.size(self._name) return self._size def read(self, num_bytes=None): if num_bytes is None: args = [] self.start_range = 0 else: args = [self.start_range, self.start_range + num_bytes - 1] data = self._storage._read(self._name, *args) self.file = BytesIO(data) return self.file.getvalue() def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True def close(self): if self._is_dirty: self._storage._save(self._name, self.file) self.file.close()
def save(self, filename, raw_contents, max_length=None): filename = self.get_available_name(filename, max_length) if not hasattr(self, 'mogile_class'): self.mogile_class = None # Write the file to mogile success = self.client.send_file(filename, BytesIO(raw_contents), self.mogile_class) if success: print("Wrote file to key %s, %s@%s" % (filename, self.domain, self.trackers[0])) else: print("FAILURE writing file %s" % (filename)) return force_text(filename.replace('\\', '/'))
def _save(self, name, content): self.client.put_file(name, BytesIO(content)) return name
def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True
def write(self, content): if 'w' not in self._mode: raise AttributeError("File was opened for read-only access.") self.file = BytesIO(content) self._is_dirty = True self._is_read = True
def _get_file(self): if self._file is None: data = self._storage._read(self.name) self._file = BytesIO(data) return self._file
def write(self, content): if 'w' not in self._mode: raise AttributeError("File was not opened in write mode.") self.file = BytesIO(content) self._is_dirty = True