def download_file_from_url(url): rv = requests.get(url, timeout=15) if rv.status_code not in (200, 201): raise KoldoctaApiError.internalError('Failed to retrieve file from URL: %s' % url) mime = magic.from_buffer(rv.content, mime=True).decode('UTF-8') ext = mime.split('/')[1] name = str(ObjectId()) + ext return BytesIO(rv.content), name, mime
def download_file_from_url(url): rv = requests.get(url, timeout=15) if rv.status_code not in (200, 201): raise KoldoctaApiError.internalError( 'Failed to retrieve file from URL: %s' % url) mime = magic.from_buffer(rv.content, mime=True).decode('UTF-8') ext = mime.split('/')[1] name = str(ObjectId()) + ext return BytesIO(rv.content), name, mime
def process_file_from_stream(content, content_type=None): content_type = content_type or content.content_type content = BytesIO(content.read()) if 'application/' in content_type: content_type = magic.from_buffer(content.getvalue(), mime=True).decode('UTF-8') content.seek(0) file_type, ext = content_type.split('/') try: metadata = process_file(content, file_type) except OSError: # error from PIL when image is supposed to be an image but is not. raise KoldoctaApiError.internalError('Failed to process file') file_name = get_file_name(content) content.seek(0) metadata = encode_metadata(metadata) metadata.update({'length': json.dumps(len(content.getvalue()))}) return file_name, content_type, metadata
def on_create(self, docs): for doc in docs: if doc.get('URL') and doc.get('media'): message = 'Uploading file by URL and file stream in the same time is not supported.' raise KoldoctaApiError.badRequestError(message) content = None filename = None content_type = None if doc.get('media'): content = doc['media'] filename = content.filename content_type = content.mimetype elif doc.get('URL'): content, filename, content_type = self.download_file(doc) self.store_file(doc, content, filename, content_type)
def store_file(self, doc, content, filename, content_type): # retrieve file name and metadata from file file_name, content_type, metadata = process_file_from_stream(content, content_type=content_type) try: logger.debug('Going to save media file with %s ' % file_name) content.seek(0) file_id = app.media.put(content, filename=file_name, content_type=content_type, resource=self.datasource, metadata=metadata) doc['media'] = file_id doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) inserted = [doc['media']] except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise KoldoctaApiError.internalError('Generating renditions failed')
def get_upload_as_data_uri(media_id): media_file = app.media.get(media_id, 'upload') if media_file: data = wrap_file(request.environ, media_file, buffer_size=1024 * 256) response = app.response_class(data, mimetype=media_file.content_type, direct_passthrough=True) response.content_length = media_file.length response.last_modified = media_file.upload_date response.set_etag(media_file.md5) response.cache_control.max_age = cache_for response.cache_control.s_max_age = cache_for response.cache_control.public = True response.make_conditional(request) response.headers["Content-Disposition"] = \ 'attachment; filename="{filename}"'.format(filename=media_file.filename) return response raise KoldoctaApiError.notFoundError('File not found on media storage.')
def get_upload_as_data_uri(media_id): media_file = app.media.get(media_id, 'upload') if media_file: data = wrap_file(request.environ, media_file, buffer_size=1024 * 256) response = app.response_class( data, mimetype=media_file.content_type, direct_passthrough=True) response.content_length = media_file.length response.last_modified = media_file.upload_date response.set_etag(media_file.md5) response.cache_control.max_age = cache_for response.cache_control.s_max_age = cache_for response.cache_control.public = True response.make_conditional(request) response.headers["Content-Disposition"] = \ 'attachment; filename="{filename}"'.format(filename=media_file.filename) return response raise KoldoctaApiError.notFoundError('File not found on media storage.')
def store_file(self, doc, content, filename, content_type): # retrieve file name and metadata from file file_name, content_type, metadata = process_file_from_stream( content, content_type=content_type) try: logger.debug('Going to save media file with %s ' % file_name) content.seek(0) file_id = app.media.put(content, filename=file_name, content_type=content_type, resource=self.datasource, metadata=metadata) doc['media'] = file_id doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) inserted = [doc['media']] except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise KoldoctaApiError.internalError( 'Generating renditions failed')
def server_error_handler(error): """Log server errors.""" # app.sentry.captureException() # app.logger.exception(error) return_error = KoldoctaApiError.internalError() return client_error_handler(return_error)