Пример #1
0
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
Пример #2
0
 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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
 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