def normalize_filename(filename, request): if FILE_NORMALIZER: # Get something the user can recognise. filename = IUserPreferredFileNameNormalizer(request).normalize( filename) filename = safe_unicode(filename) # Also, get something that does not raise a ConstraintNotSatisfiedError # when migrating to blob attachments. Found in live data: a filename that # includes a newline... filename = filename.replace('\n', ' ').replace('\r', ' ') return filename
def __call__(self): context = aq_inner(self.context) request = self.request response_id = self.validate_response_id() file = None if response_id != -1: response = self.folder[response_id] file = response.attachment if file is None: status = IStatusMessage(request) msg = _(u"Response id ${response_id} has no attachment.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=context) status.addStatusMessage(msg, type='error') if file is None: request.response.redirect(context.absolute_url()) # From now on file exists. # Code mostly taken from Archetypes/Field.py:FileField.download filename = getattr(file, 'filename', file.getId()) if filename is not None: if FILE_NORMALIZER: filename = IUserPreferredFileNameNormalizer(request).normalize( safe_unicode(filename, context.getCharset())) else: filename = safe_unicode(filename, context.getCharset()) header_value = contentDispositionHeader( disposition='attachment', filename=filename) request.response.setHeader("Content-disposition", header_value) return file.index_html(request, request.response)
def get_logo(self, disposition='inline', headers=True): portal = getToolByName(self.context, 'portal_url').getPortalObject() customstyles_util = CustomStylesUtility(portal) customstyles = customstyles_util.annotations.get( 'customstyles', OOBTree(DEFAULT_STYLES)) REQUEST = self.request RESPONSE = REQUEST.RESPONSE blob = LOGO_KEY in customstyles and customstyles[LOGO_RIGHT_KEY] or None if not blob: return '' length = blob.get_size() if headers: RESPONSE.setHeader('Last-Modified', rfc1123_date(self.context._p_mtime)) RESPONSE.setHeader('Content-Type', blob.getContentType()) RESPONSE.setHeader('Accept-Ranges', 'bytes') if handleIfModifiedSince(self.context, REQUEST, RESPONSE): return '' RESPONSE.setHeader('Content-Length', length) filename = blob.getFilename() if filename is not None: filename = IUserPreferredFileNameNormalizer(REQUEST).normalize( unicode(filename, self.context.getCharset())) header_value = contentDispositionHeader( disposition=disposition, filename=filename) RESPONSE.setHeader("Content-disposition", header_value) range = handleRequestRange(self.context, length, REQUEST, RESPONSE) return blob.getIterator(**range)
def fixAutoId(self, instance): """ if an explicit id was given and the instance still has the auto-generated one it should be renamed; also see `_setATCTFileContent` in ATCT's `ATCTFileContent` class """ if not self.primary: return filename = self.getFilename(instance) if filename is not None \ and instance._isIDAutoGenerated(instance.getId()): request = instance.REQUEST req_id = request.form.get('id') if req_id and not instance._isIDAutoGenerated(req_id): return # don't rename if an explicit id was given if hasattr(aq_base(instance), '_should_set_id_to_filename'): # ^^ BBB for ATContentTypes <2.0 if not instance._should_set_id_to_filename( filename, request.form.get('title')): return # don't rename now if AT should do it from title if not isinstance(filename, unicode): filename = unicode(filename, instance.getCharset()) filename = IUserPreferredFileNameNormalizer(request).normalize( filename) if filename and not filename == instance.getId(): # a file name was given, so the instance needs to be renamed... instance.setId(filename)
def index_html(self, instance, REQUEST=None, RESPONSE=None, disposition='inline'): """ make it directly viewable when entering the objects URL """ if REQUEST is None: REQUEST = instance.REQUEST if RESPONSE is None: RESPONSE = REQUEST.RESPONSE blob = self.getUnwrapped(instance, raw=True) # TODO: why 'raw'? RESPONSE.setHeader('Last-Modified', rfc1123_date(instance._p_mtime)) RESPONSE.setHeader('Content-Type', self.getContentType(instance)) # The only change is to comment out this header: #RESPONSE.setHeader('Accept-Ranges', 'bytes') if handleIfModifiedSince(instance, REQUEST, RESPONSE): return '' length = blob.get_size() RESPONSE.setHeader('Content-Length', length) filename = self.getFilename(instance) if filename is not None: filename = IUserPreferredFileNameNormalizer(REQUEST).normalize( unicode(filename, instance.getCharset())) header_value = contentDispositionHeader(disposition=disposition, filename=filename) RESPONSE.setHeader("Content-disposition", header_value) range = handleRequestRange(instance, length, REQUEST, RESPONSE) return blob.getIterator(**range)
def cleanupFilename(filename, request=None): """Removes bad chars from file names to make them a good id """ if not filename: return if request is not None: return IUserPreferredFileNameNormalizer(request).normalize(filename) return None
def ImageScale_index_html(self, REQUEST=None, RESPONSE=None): """ Inject X-Sendfile and X-Accel-Redirect headers into response. """ if REQUEST is None: REQUEST = self.REQUEST if RESPONSE is None: RESPONSE = REQUEST.RESPONSE blob = getattr(self, "blob", None) if not blob: return super(ImageScale, self).index_html(REQUEST, RESPONSE) if set_xsendfile_header(REQUEST, RESPONSE, blob): filename = self.filename if self.filename is not None: normalizer = IUserPreferredFileNameNormalizer(REQUEST) filename = normalizer.normalize(unicode(self.filename, self.getCharset())) header_value = contentDispositionHeader(disposition="inline", filename=filename) RESPONSE.setHeader("Content-disposition", header_value) RESPONSE.setHeader("Content-Type", self.content_type) return "collective.xsendfile - proxy missing?" else: return super(ImageScale, self).index_html(REQUEST, RESPONSE)
def index_html(self, REQUEST=None, RESPONSE=None, charset='utf-8', disposition='inline'): """ make it directly viewable when entering the objects URL """ if REQUEST is None: REQUEST = self.REQUEST if RESPONSE is None: RESPONSE = REQUEST.RESPONSE RESPONSE.setHeader('Last-Modified', rfc1123_date(self._p_mtime)) RESPONSE.setHeader('Content-Type', self.getContentType()) RESPONSE.setHeader('Accept-Ranges', 'bytes') if handleIfModifiedSince(self, REQUEST, RESPONSE): return '' length = self.get_size() RESPONSE.setHeader('Content-Length', length) filename = self.getFilename() if filename is not None: if not isinstance(filename, unicode): filename = unicode(filename, charset, errors='ignore') filename = IUserPreferredFileNameNormalizer(REQUEST).normalize( filename) header_value = contentDispositionHeader( disposition=disposition, filename=filename, ) # Add original filename in utf-8, ref to rfc2231 RESPONSE.setHeader('Content-disposition', header_value) request_range = handleRequestRange(self, length, REQUEST, RESPONSE) return self.getIterator(**request_range)
def quick_upload_file(self): context = aq_inner(self.context) request = self.request response = request.RESPONSE response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT') response.setHeader('Cache-control', 'no-cache') # the good content type woul be text/json or text/plain but IE # do not support it response.setHeader('Content-Type', 'text/html; charset=utf-8') # disable diazo themes request.response.setHeader('X-Theme-Disabled', 'True') if request.HTTP_X_REQUESTED_WITH: # using ajax upload file_name = urllib.unquote(request.HTTP_X_FILE_NAME) upload_with = "XHR" try: file = request.BODYFILE file_data = file.read() file.seek(0) except AttributeError: # in case of cancel during xhr upload logger.error("Upload of %s has been aborted", file_name) # not really useful here since the upload block # is removed by "cancel" action, but # could be useful if someone change the js behavior return json.dumps({u'error': u'emptyError'}) except: logger.error( "Error when trying to read the file %s in request", file_name ) return json.dumps({u'error': u'serverError'}) else: # using classic form post method (MSIE<=8) file = request.get("qqfile", None) file_data = file.read() file.seek(0) filename = getattr(file, 'filename', '') file_name = filename.split("\\")[-1] try: file_name = file_name.decode('utf-8') except UnicodeDecodeError: pass file_name = IUserPreferredFileNameNormalizer( self.request ).normalize(file_name) upload_with = "CLASSIC FORM POST" # we must test the file size in this case (no client test) if not self._check_file_size(file_data): logger.info("Test file size: the file %s is too big, upload " "rejected" % filename) return json.dumps({u'error': u'sizeError'}) # overwrite file try: newid = get_id_from_filename(file_name, context) except MissingExtension: return json.dumps({u'error': u'missingExtension'}) if newid in context or file_name in context: updated_object = context.get(newid, False) or context[file_name] mtool = getToolByName(context, 'portal_membership') override_setting = self.qup_prefs.object_override if override_setting and\ mtool.checkPermission(ModifyPortalContent, updated_object): can_overwrite = True else: can_overwrite = False if not can_overwrite: logger.debug( "The file id for %s already exists, upload rejected" % file_name ) return json.dumps({u'error': u'serverErrorAlreadyExists'}) overwritten_file = updated_object else: overwritten_file = None content_type = get_content_type(context, file_data, file_name) portal_type = getDataFromAllRequests(request, 'typeupload') or '' title = getDataFromAllRequests(request, 'title') or '' description = getDataFromAllRequests(request, 'description') or '' if not portal_type: ctr = getToolByName(context, 'content_type_registry') portal_type = ctr.findTypeName( file_name.lower(), content_type, '' ) or 'File' if file_data: if overwritten_file is not None: updater = IQuickUploadFileUpdater(context) logger.info( "reuploading %s file with %s: title=%s, description=%s, " "content_type=%s" % (overwritten_file.absolute_url(), upload_with, title, description, content_type)) try: f = updater(overwritten_file, file_name, title, description, content_type, file_data) except Exception, e: logger.error( "Error updating %s file: %s", file_name, str(e) ) return json.dumps({u'error': u'serverError'}) else: factory = IQuickUploadFileFactory(context) logger.info( "uploading file with %s: filename=%s, title=%s, " "description=%s, content_type=%s, portal_type=%s" % (upload_with, file_name, title, description, content_type, portal_type)) try: f = factory(file_name, title, description, content_type, file_data, portal_type) except Exception, e: logger.error( "Error creating %s file: %s", file_name, str(e) ) return json.dumps({u'error': u'serverError'})
def quick_upload_file(self) : context = aq_inner(self.context) request = self.request response = request.RESPONSE response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT') response.setHeader('Cache-control', 'no-cache') # the good content type woul be text/json or text/plain but IE # do not support it response.setHeader('Content-Type', 'text/html; charset=utf-8') # disable diazo themes request.response.setHeader('X-Theme-Disabled', 'True') if request.HTTP_X_REQUESTED_WITH : # using ajax upload file_name = urllib.unquote(request.HTTP_X_FILE_NAME) upload_with = "XHR" try : file = request.BODYFILE file_data = file.read() file.seek(0) except AttributeError : # in case of cancel during xhr upload logger.error("Upload of %s has been aborted", file_name) # not really useful here since the upload block # is removed by "cancel" action, but # could be useful if someone change the js behavior return json.dumps({u'error': u'emptyError'}) except : logger.error("Error when trying to read the file %s in request", file_name) return json.dumps({u'error': u'serverError'}) else : # using classic form post method (MSIE<=8) file_data = request.get("qqfile", None) filename = getattr(file_data,'filename', '') file_name = filename.split("\\")[-1] try: file_name = file_name.decode('utf-8') except UnicodeDecodeError: pass file_name = IUserPreferredFileNameNormalizer(self.request ).normalize(file_name) upload_with = "CLASSIC FORM POST" # we must test the file size in this case (no client test) if not self._check_file_size(file_data) : logger.info("Test file size : the file %s is too big, upload rejected" % filename) return json.dumps({u'error': u'sizeError'}) # overwrite file try: newid = get_id_from_filename(file_name, context) except MissingExtension: return json.dumps({u'error': u'missingExtension'}) if newid in context or file_name in context: updated_object = context.get(newid, False) or context[file_name] mtool = getToolByName(context, 'portal_membership') if mtool.checkPermission(ModifyPortalContent, updated_object): can_overwrite = True else: can_overwrite = False if not can_overwrite: logger.debug("The file id for %s already exists, upload rejected" % file_name) return json.dumps({u'error': u'serverErrorAlreadyExists'}) overwritten_file = updated_object else: overwritten_file = None content_type = mimetypes.guess_type(file_name)[0] # sometimes plone mimetypes registry could be more powerful if not content_type : mtr = getToolByName(context, 'mimetypes_registry') oct = mtr.globFilename(file_name) if oct is not None : content_type = str(oct) portal_type = getDataFromAllRequests(request, 'typeupload') or '' title = getDataFromAllRequests(request, 'title') or '' description = getDataFromAllRequests(request, 'description') or '' if not portal_type : ctr = getToolByName(context, 'content_type_registry') portal_type = ctr.findTypeName(file_name.lower(), content_type, '') or 'File' if file_data: if overwritten_file is not None: updater = IQuickUploadFileUpdater(context) logger.info("reuploading %s file with %s : title=%s, description=%s, content_type=%s" % \ (overwritten_file.absolute_url(), upload_with, title, description, content_type)) try : f = updater(overwritten_file, file_name, title, description, content_type, file_data) except Exception, e: logger.error("Error updating %s file : %s", file_name, str(e)) return json.dumps({u'error': u'serverError'}) else: factory = IQuickUploadFileFactory(context) logger.info("uploading file with %s : filename=%s, title=%s, description=%s, content_type=%s, portal_type=%s" % \ (upload_with, file_name, title, description, content_type, portal_type)) try : f = factory(file_name, title, description, content_type, file_data, portal_type) except Exception, e: logger.error("Error creating %s file : %s", file_name, str(e)) return json.dumps({u'error': u'serverError'})
def quick_upload_file(self): context = aq_inner(self.context) request = self.request response = request.RESPONSE response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT') response.setHeader('Cache-control', 'no-cache') # application/json is not supported by old IEs but text/html fails in # every browser with plone.protect 3.0.11 response.setHeader('Content-Type', 'application/json; charset=utf-8') # disable diazo themes and csrf protection request.response.setHeader('X-Theme-Disabled', 'True') if request.HTTP_X_REQUESTED_WITH: # using ajax upload file_name = urllib.unquote(request.HTTP_X_FILE_NAME) upload_with = "XHR" try: file = request.BODYFILE file_data = file.read() file.seek(0) except AttributeError: # in case of cancel during xhr upload logger.error("Upload of %s has been aborted", file_name) # not really useful here since the upload block # is removed by "cancel" action, but # could be useful if someone change the js behavior return json.dumps({u'error': u'emptyError'}) except: logger.error( "Error when trying to read the file %s in request", file_name) return self._error_response(u'serverError') else: # using classic form post method (MSIE<=8) file = request.get("qqfile", None) file_data = file.read() file.seek(0) filename = getattr(file, 'filename', '') file_name = filename.split("\\")[-1] try: file_name = file_name.decode('utf-8') except UnicodeDecodeError: pass file_name = IUserPreferredFileNameNormalizer( self.request).normalize(file_name) upload_with = "CLASSIC FORM POST" # we must test the file size in this case (no client test) if not self._check_file_size(file): logger.info("Test file size: the file %s is too big, upload " "rejected" % filename) return self._error_response(u'sizeError') # overwrite file try: newid = get_id_from_filename( file_name, context, unique=self.qup_prefs.object_unique_id) except MissingExtension: return self._error_response(u'missingExtension') if (newid in context or file_name in context) and \ not self.qup_prefs.object_unique_id: updated_object = context.get(newid, False) or context[file_name] mtool = getToolByName(context, 'portal_membership') override_setting = self.qup_prefs.object_override if override_setting and\ mtool.checkPermission(ModifyPortalContent, updated_object): can_overwrite = True else: can_overwrite = False if not can_overwrite: logger.debug( "The file id for %s already exists, upload rejected" % file_name) return self._error_response(u'serverErrorAlreadyExists') overwritten_file = updated_object else: overwritten_file = None content_type = get_content_type(context, file_data, file_name) portal_type = getDataFromAllRequests(request, 'typeupload') or '' title = getDataFromAllRequests(request, 'title') or '' description = getDataFromAllRequests(request, 'description') or '' if not title.strip() and self.qup_prefs.id_as_title: title = newid if not portal_type: ctr = getToolByName(context, 'content_type_registry') portal_type = ctr.findTypeName(file_name.lower(), content_type, '') or 'File' if not file_data: return self._error_response(u'emptyError') if overwritten_file is not None: updater = IQuickUploadFileUpdater(context) logger.info( "reuploading %s file with %s: title=%s, description=%s, " "content_type=%s" % (overwritten_file.absolute_url(), upload_with, title, description, content_type)) try: f = updater(overwritten_file, file_name, title, description, content_type, file_data) except ConflictError: # Allow Zope to retry up to three times, and if that still # fails, handle ConflictErrors on client side if necessary raise except Exception as e: logger.error("Error updating %s file: %s", file_name, str(e)) return self._error_response(u'serverError') else: factory = IQuickUploadFileFactory(context) logger.info("uploading file with %s: filename=%s, title=%s, " "description=%s, content_type=%s, portal_type=%s" % (upload_with, file_name, title, description, content_type, portal_type)) try: f = factory(file_name, title, description, content_type, file_data, portal_type) except ConflictError: # Allow Zope to retry up to three times, and if that still # fails, handle ConflictErrors on client side if necessary raise except Exception as e: logger.error("Error creating %s file: %s", file_name, str(e)) return self._error_response(u'serverError') if f['success'] is None: return self._error_response(f['error']) obj = f['success'] logger.info("file url: %s" % obj.absolute_url()) return self._success_response(obj)
def handleFileField(context, value, obj=None, is_primary=False, with_title=False): if not value: return "" name = getattr(value, 'filename', '') # if obj: # name = obj.getId() # if not name: # try: # name = value.getId() # except: # name = '' # if not name: # return '' name = IUserPreferredFileNameNormalizer(context.request).normalize( safe_unicode(name)) # Crude band-aid: if there's no ending, stick in the lower part of # the content type if name.find('.') == -1: if IDexterityContent.providedBy(obj): content_type = getattr(value, 'contentType', '') else: content_type = getattr(value, 'content_type', '') name = "{0}.{1}".format( name, content_type.split('/')[-1]) if is_primary: item_path = '/'.join(aq_parent(obj).getPhysicalPath()[context.LEN_PORTAL_PATH:]) else: item_path = '/'.join(obj.getPhysicalPath()[context.LEN_PORTAL_PATH:]) file_path = '/{0}/{1}'.format(item_path, name) try: data = value.data except POSKeyError: data = "" if isinstance(data, Pdata): data = data.data if len(data) == 0: return '' if context.export_binary: os.chdir(context.exportdir) if not os.path.exists(item_path): os.makedirs(item_path) fn = '{0}{1}'.format(context.exportdir, file_path) try: fh = open(fn, 'w') except IOError, err: if err.strerror == 'File name too long': # try to build a shorter filename name = "{0}.{1}".format(obj.id, value.content_type.split('/')[-1]) file_path = '/{0}/{1}'.format(item_path, name) fn = '{0}{1}'.format(context.exportdir, file_path) try: fh = open(fn, 'w') except IOError: fh = None file_path = '' else: fh = None file_path = '' except Exception: fh = None file_path = ''
def quick_upload_file(self) : context = aq_inner(self.context) request = self.request response = request.RESPONSE response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT') response.setHeader('Cache-control', 'no-cache') # the good content type woul be text/json or text/plain but IE # do not support it response.setHeader('Content-Type', 'text/html; charset=utf-8') # disable diazo themes request.response.setHeader('X-Theme-Disabled', 'True') if request.HTTP_X_REQUESTED_WITH : # using ajax upload file_name = urllib.unquote(request.HTTP_X_FILE_NAME) upload_with = "XHR" try : file = request.BODYFILE file_data = file.read() file.seek(0) except AttributeError : # in case of cancel during xhr upload logger.error("Upload of %s has been aborted", file_name) # not really useful here since the upload block # is removed by "cancel" action, but # could be useful if someone change the js behavior return json.dumps({u'error': u'emptyError'}) except : logger.error("Error when trying to read the file %s in request", file_name) return json.dumps({u'error': u'serverError'}) else : # using classic form post method (MSIE<=8) file_data = request.get("qqfile", None) filename = getattr(file_data,'filename', '') file_name = filename.split("\\")[-1] file_name = IUserPreferredFileNameNormalizer(self.request ).normalize(file_name) upload_with = "CLASSIC FORM POST" # we must test the file size in this case (no client test) if not self._check_file_size(file_data) : logger.info("Test file size : the file %s is too big, upload rejected" % filename) return json.dumps({u'error': u'sizeError'}) if not self._check_file_id(file_name) or file_name in context: logger.debug("The file id for %s already exists, upload rejected" % file_name) return json.dumps({u'error': u'serverErrorAlreadyExists'}) content_type = mimetypes.guess_type(file_name)[0] # sometimes plone mimetypes registry could be more powerful if not content_type : mtr = getToolByName(context, 'mimetypes_registry') oct = mtr.globFilename(file_name) if oct is not None : content_type = str(oct) portal_type = getDataFromAllRequests(request, 'typeupload') or '' title = getDataFromAllRequests(request, 'title') or '' description = getDataFromAllRequests(request, 'description') or '' if not portal_type : ctr = getToolByName(context, 'content_type_registry') portal_type = ctr.findTypeName(file_name.lower(), content_type, '') or 'File' if file_data: factory = IQuickUploadFileFactory(context) logger.info("uploading file with %s : filename=%s, title=%s, description=%s, content_type=%s, portal_type=%s" % \ (upload_with, file_name, title, description, content_type, portal_type)) try : f = factory(file_name, title, description, content_type, file_data, portal_type) except Exception, e: logger.error("Error creating %s file : %s", file_name, str(e)) return json.dumps({u'error': u'serverError'}) if f['success'] is not None : o = f['success'] logger.info("file url: %s" % o.absolute_url()) msg = { u'success': True, u'uid': o.UID(), u'name': o.getId(), u'title': o.pretty_title_or_id() } else : msg = {u'error': f['error']}
def __call__(self, filename): return IUserPreferredFileNameNormalizer(self.request).normalize( safe_unicode(filename))
def quick_upload_file(self): context = aq_inner(self.context) request = self.request response = request.RESPONSE response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT') response.setHeader('Cache-control', 'no-cache') # application/json is not supported by old IEs but text/html fails in # every browser with plone.protect 3.0.11 response.setHeader('Content-Type', 'application/json; charset=utf-8') # disable diazo themes and csrf protection request.response.setHeader('X-Theme-Disabled', 'True') if request.HTTP_X_REQUESTED_WITH: # using ajax upload file_name = urllib.unquote(request.HTTP_X_FILE_NAME) upload_with = "XHR" try: file = request.BODYFILE file_data = file.read() file.seek(0) except AttributeError: # in case of cancel during xhr upload logger.error("Upload of %s has been aborted", file_name) # not really useful here since the upload block # is removed by "cancel" action, but # could be useful if someone change the js behavior return json.dumps({u'error': u'emptyError'}) except: logger.error( "Error when trying to read the file %s in request", file_name ) return json.dumps({u'error': u'serverError'}) else: # using classic form post method (MSIE<=8) file = request.get("qqfile", None) file_data = file.read() file.seek(0) filename = getattr(file, 'filename', '') file_name = filename.split("\\")[-1] try: file_name = file_name.decode('utf-8') except UnicodeDecodeError: pass file_name = IUserPreferredFileNameNormalizer( self.request ).normalize(file_name) upload_with = "CLASSIC FORM POST" # we must test the file size in this case (no client test) if not self._check_file_size(file): logger.info("Test file size: the file %s is too big, upload " "rejected" % filename) return json.dumps({u'error': u'sizeError'}) # overwrite file try: newid = get_id_from_filename( file_name, context, unique=self.qup_prefs.object_unique_id) except MissingExtension: return json.dumps({u'error': u'missingExtension'}) if (newid in context or file_name in context) and \ not self.qup_prefs.object_unique_id: updated_object = context.get(newid, False) or context[file_name] mtool = getToolByName(context, 'portal_membership') override_setting = self.qup_prefs.object_override if override_setting and\ mtool.checkPermission(ModifyPortalContent, updated_object): can_overwrite = True else: can_overwrite = False if not can_overwrite: logger.debug( "The file id for %s already exists, upload rejected" % file_name ) return json.dumps({u'error': u'serverErrorAlreadyExists'}) overwritten_file = updated_object else: overwritten_file = None content_type = get_content_type(context, file_data, file_name) portal_type = getDataFromAllRequests(request, 'typeupload') or '' title = getDataFromAllRequests(request, 'title') or '' description = getDataFromAllRequests(request, 'description') or '' if not title.strip() and self.qup_prefs.id_as_title: title = newid if not portal_type: ctr = getToolByName(context, 'content_type_registry') portal_type = ctr.findTypeName( file_name.lower(), content_type, '' ) or 'File' if file_data: if overwritten_file is not None: updater = IQuickUploadFileUpdater(context) logger.info( "reuploading %s file with %s: title=%s, description=%s, " "content_type=%s" % (overwritten_file.absolute_url(), upload_with, title, description, content_type)) try: f = updater(overwritten_file, file_name, title, description, content_type, file_data) except ConflictError: # Allow Zope to retry up to three times, and if that still # fails, handle ConflictErrors on client side if necessary raise except Exception as e: logger.error( "Error updating %s file: %s", file_name, str(e) ) return json.dumps({u'error': u'serverError'}) else: factory = IQuickUploadFileFactory(context) logger.info( "uploading file with %s: filename=%s, title=%s, " "description=%s, content_type=%s, portal_type=%s" % (upload_with, file_name, title, description, content_type, portal_type)) try: f = factory(file_name, title, description, content_type, file_data, portal_type) except ConflictError: # Allow Zope to retry up to three times, and if that still # fails, handle ConflictErrors on client side if necessary raise except Exception as e: logger.error( "Error creating %s file: %s", file_name, str(e) ) return json.dumps({u'error': u'serverError'}) if f['success'] is not None: o = f['success'] logger.info("file url: %s" % o.absolute_url()) if HAS_UUID: uid = IUUID(o) else: uid = o.UID() msg = { u'success': True, u'uid': uid, u'name': o.getId(), u'title': o.pretty_title_or_id() } else: msg = {u'error': f['error']} else: msg = {u'error': u'emptyError'} return json.dumps(msg)