Exemplo n.º 1
0
def _download(url: str) -> File:
    resp = requests.get(url, timeout=5)
    content = BytesIO(resp.content)
    file = File(stream=content,
                mimetype=USE_MAGIC)
    file.size = resp.headers['Content-Length']
    return file
Exemplo n.º 2
0
 def _crop_and_resize_image(self,
                            context: IResource,
                            registry: Registry) -> File:
     parent_file = retrieve_asset_file(context.__parent__, registry)
     # Crop and resize image via PIL
     with parent_file.blob.open('r') as blobdata:
         mimetype = parent_file.mimetype
         image = Image.open(blobdata)
         cropped_image = self._crop_if_needed(image)
         resized_image = cropped_image.resize(self.dimensions,
                                              Image.ANTIALIAS)
         bytestream = io.BytesIO()
         resized_image.save(bytestream, image.format)
         bytestream.seek(0)
     # Store as substanced File and return
     self.file = File(stream=bytestream, mimetype=mimetype)
     transaction.commit()  # to avoid BlobError: Uncommitted changes
     return self.file
Exemplo n.º 3
0
 def deserialize(self, node, value):
     """Deserialize into a File."""
     if value == colander.null:
         return None
     try:
         result = File(stream=value.file,
                       mimetype=USE_MAGIC,
                       title=value.filename)
         # We add the size as an extra attribute since get_size() doesn't
         # work before the transaction has been committed
         if isinstance(value.file, io.BytesIO):
             result.size = len(value.file.getvalue())
         else:
             result.size = os.fstat(value.file.fileno()).st_size
     except Exception as err:
         raise colander.Invalid(node, msg=str(err), value=value)
     if result.size > self.SIZE_LIMIT:
         msg = 'Asset too large: {} bytes'.format(result.size)
         raise colander.Invalid(node, msg=msg, value=value)
     return result
Exemplo n.º 4
0
 def deserialize(self, node: SchemaNode, value: object) -> File:
     """Deserialize :class:`cgi.file` or class:`deform.widget.filedict` ."""
     if value == null:
         return None
     try:
         filedata, filename = self._get_file_data_and_name(value)
         filedata.seek(0)
         result = File(stream=filedata,
                       mimetype=USE_MAGIC,
                       title=filename)
         # We add the size as an extra attribute since get_size() doesn't
         # work before the transaction has been committed
         if isinstance(filedata, io.BytesIO):
             result.size = len(filedata.getvalue())
         else:
             result.size = os.fstat(filedata.fileno()).st_size
     except Exception as err:
         raise Invalid(node, msg=str(err), value=value)
     if result.size > self.SIZE_LIMIT:
         msg = 'Asset too large: {} bytes'.format(result.size)
         raise Invalid(node, msg=msg, value=value)
     return result