def uploadBlobField(self, clazz, file=b'', filename=''): try: file = file.read() except: pass f = None if isinstance(file, six.string_types): f = re.findall('^data:(.*?);base64,([\s\S]*)$', file) if f: mt = f[0][0] file = base64.b64decode(f[0][1]) else: mt, enc = standard.guess_content_type(filename, file) if clazz in [_globals.DT_IMAGE, 'image'] or mt.startswith('image'): clazz = MyImage elif clazz in [_globals.DT_FILE, 'file']: clazz = MyFile # blob = clazz( id='', title='', file='') blob = clazz(id='', title='', file=bytes('', 'utf-8')) blob.update_data(file, content_type=mt, size=len(file)) blob.aq_parent = self blob.mediadbfile = None blob.filename = str(_fileutil.extractFilename(filename, undoable=True)) # Check size. if self is not None: maxlength_prop = 'ZMS.input.%s.maxlength' % ['file', 'image' ][isinstance( blob, MyImage)] maxlength = self.getConfProperty(maxlength_prop, '') if len(maxlength) > 0: size = blob.get_size() if size > int(maxlength): raise zExceptions.Forbidden( 'size=%i > %s=%i' % (size, maxlength_prop, int(maxlength))) return blob
def retrieveFileStreamIterator(self, filename, REQUEST=None): threshold = 2 << 16 # 128 kb local_filename = self.targetFile(filename) try: fsize = os.path.getsize(local_filename) except: fsize = 0 raise NotFound if fsize < threshold or REQUEST.RESPONSE is None: try: f = open(local_filename, 'rb') data = f.read() finally: f.close() else: data = filestream_iterator(local_filename, 'rb') try: mt, enc = standard.guess_content_type(local_filename, data) except: mt, enc = 'content/unknown', '' # Remove timestamp from filename. filename = filename[:filename.rfind('_')] + filename[filename.rfind('.' ):] standard.set_response_headers(filename, mt, fsize, REQUEST) return data
def addImage(container, id, title, data, content_type=None): """ Add Image to container. """ if content_type is None: content_type, enc = standard.guess_content_type(id, data) container.manage_addImage(id=id, title=title, file=data, content_type=content_type) ob = getattr( container, id) return ob
def addFile(container, id, title, data, content_type=None): """ Add File to container. """ if content_type is None: if type(data) is str: data = standard.pybytes(data,'utf-8') content_type, enc = standard.guess_content_type(id, data) container.manage_addFile(id=id, title=title, file=data, content_type=content_type) ob = getattr( container, id) return ob
def getDiffs(self, provider, ignore=True): standard.writeLog(self, "[getDiffs]: provider=%s" % str(provider)) diff = [] local = self.localFiles(provider) remote = self.remoteFiles(provider) filenames = sorted(set(list(local) + list(remote))) for filename in filenames: if ignore and filename not in local.keys(): # ignore orphaned files in filesystem # if there are no references in model continue l = local.get(filename, {}) r = remote.get(filename, {}) if isinstance(l.get('data', ''), bytes): try: l['data'] = l['data'].decode('utf-8') except: pass if isinstance(r.get('data', ''), bytes): try: r['data'] = r['data'].decode('utf-8') except: pass if l.get('data', '') != r.get('data', ''): data = l.get('data', r.get('data', '')) try: try: mt, enc = standard.guess_content_type( filename.split('/')[-1], data) except: mt, enc = standard.guess_content_type( filename.split('/')[-1], data.encode('utf-8')) diff.append((filename, mt, l.get('id', r.get('id', '?')), l, r)) except: standard.writeLog( self, "[getDiffs]: Error in appending filename = %s to variable data, Line 232" % str(filename)) pass return diff
def getDiffs(self, provider, ignore=True): standard.writeLog(self, "[getDiffs]: provider=%s" % str(provider)) diff = [] local = self.localFiles(provider) remote = self.remoteFiles(provider) filenames = sorted(set(list(local) + list(remote))) for filename in filenames: if ignore and filename not in local.keys(): # ignore orphaned files in filesystem # if there are no references in model continue l = local.get(filename, {}) l_data = l.get('data') r = remote.get(filename, {}) r_data = r.get('data') # Check whether any bytes data are decodeable as utf-8 text if isinstance(l_data, bytes): try: l['data'] = l_data.decode('utf-8') except: # data is no text, but image etc. pass if isinstance(r_data, bytes): try: r['data'] = r_data.decode('utf-8') except: pass # If text then normalize Windows CR+LF line break to Unix LF if isinstance(l.get('data'), str): l['data'] = l['data'].replace('\r', '') if isinstance(r.get('data'), str): r['data'] = r['data'].replace('\r', '') # Only if text is not equal add to diff list if l.get('data') != r.get('data'): data = l_data or r_data if isinstance(data, str): data = data.encode('utf-8') mt, enc = standard.guess_content_type( filename.split('/')[-1], data) diff.append((filename, mt, l.get('id', r.get('id', '?')), l, r)) return diff
def getDiffs(self, provider, ignore=True): standard.writeLog(self, "[getDiffs]: provider=%s" % str(provider)) diff = [] local = self.localFiles(provider) remote = self.remoteFiles(provider) filenames = sorted(set(list(local) + list(remote))) for filename in filenames: if ignore and filename not in local.keys(): # ignore orphaned files in filesystem # if there are no references in model continue l = local.get(filename, {}) l_data = l.get('data') r = remote.get(filename, {}) r_data = r.get('data') # Try normalizing text codes to cleaned utf-8 if isinstance(l.get('data'), (str, bytes)): try: l['data'] = standard.pystr2(l['data']).decode('utf-8') except: pass if isinstance(r.get('data'), (str, bytes)): try: r['data'] = standard.pystr2(r['data']).decode('utf-8') except: pass # Try normalizing line breaks try: l['data'] = l['data'].replace('\r', '') r['data'] = r['data'].replace('\r', '') except: pass # Compare the the two sides if l.get('data') != r.get('data'): data = l.get('data') or r.get('data') mt, enc = standard.guess_content_type( filename.split('/')[-1], data) diff.append((filename, mt, l.get('id', r.get('id', '?')), l, r)) return diff