Beispiel #1
0
 def test_tus_create(self):
     from tus import Tus, Zope2RequestAdapter
     req = self.request
     req.REQUEST_METHOD = 'POST'
     req.environ['ENTITY_LENGTH'] = '12345'
     tus = Tus(Zope2RequestAdapter(req), **self.options)
     assert tus.valid
     tus.handle()
     assert req.response.code == 201
Beispiel #2
0
 def test_tus_create(self):
     from tus import Tus, WebobAdapter
     req = Request.blank('/', method='POST')
     adapter = WebobAdapter(req)
     req.headers['ENTITY_LENGTH'] = '12345'
     tus = Tus(adapter, **self.options)
     assert tus.valid
     tus.handle()
     assert adapter.resp.status_code == 201
Beispiel #3
0
 def test_tus_upload(self):
     from tus import Tus, Zope2RequestAdapter
     req = self.request
     fi = open(test_file)
     req.REQUEST_METHOD = 'POST'
     req.environ['ENTITY_LENGTH'] = str(os.path.getsize(test_file))
     tus = Tus(Zope2RequestAdapter(req), **self.options)
     tus.handle()
     req.REQUEST_METHOD = 'PATCH'
     req._file = fi
     req.URL = req.response.getHeader('Location')
     req.environ['CONTENT_LENGTH'] = req.environ['ENTITY_LENGTH']
     req.environ['OFFSET'] = '0'
     tus.handle()
     assert tus.upload_finished
     fipath = tus.get_filepath()
     fi.seek(0)
     otherfi = open(fipath)
     self.assertEquals(fi.read(), otherfi.read())
     fi.close()
     otherfi.close()
Beispiel #4
0
 def test_tus_multi_part_upload(self):
     from tus import Tus, WebobAdapter
     req = Request.blank('/', method='POST')
     adapter = WebobAdapter(req)
     fi = open(test_file)
     length = os.path.getsize(test_file)
     req.headers['ENTITY_LENGTH'] = str(length * 2)
     tus = Tus(adapter, **self.options)
     tus.handle()
     req = Request.blank('/' + adapter.resp.headers.get('Location'),
                         method='PATCH')
     req.body_file = fi
     req.headers['CONTENT_LENGTH'] = str(length)
     req.headers['OFFSET'] = '0'
     adapter = WebobAdapter(req)
     tus = Tus(adapter, **self.options)
     tus.handle()
     assert not tus.upload_finished
     # twice
     req.headers['OFFSET'] = str(length)
     tus.handle()
     assert tus.upload_finished
     fipath = tus.get_filepath()
     otherfi = open(fipath)
     fi.seek(0)
     self.assertEquals(len(fi.read()) * 2, len(otherfi.read()))
     fi.close()
     otherfi.close()
    def __call__(self):
        req = self.request
        tusrequest = False
        if TUS_ENABLED:
            adapter = Zope2RequestAdapter(req)
            tus = Tus(adapter, **tus_settings)
            if tus.valid:
                tusrequest = True
                tus.handle()
                if not tus.upload_finished:
                    return
                else:
                    filename = req.getHeader('FILENAME')
                    if tus.send_file:
                        filedata = req._file
                        filedata.filename = filename
                    else:
                        filepath = req._file.read()
                        filedata = open(filepath)
        if not tusrequest:
            if req.REQUEST_METHOD != 'POST':
                return
            filedata = self.request.form.get("file", None)
            if filedata is None:
                return
            filename = filedata.filename
        content_type = mimetypes.guess_type(filename)[0] or ""

        if not filedata:
            return

        # Determine if the default file/image types are DX or AT based
        ctr = getToolByName(self.context, 'content_type_registry')
        type_ = ctr.findTypeName(filename.lower(), '', '') or 'File'

        DX_BASED = False
        if HAS_DEXTERITY:
            pt = getToolByName(self.context, 'portal_types')
            if IDexterityFTI.providedBy(getattr(pt, type_)):
                factory = IDXFileFactory(self.context)
                DX_BASED = True
            else:
                factory = IATCTFileFactory(self.context)
        else:
            factory = IATCTFileFactory(self.context)

        obj = factory(filename, content_type, filedata)

        if DX_BASED:
            if 'File' in obj.portal_type:
                size = obj.file.getSize()
                content_type = obj.file.contentType
            elif 'Image' in obj.portal_type:
                size = obj.image.getSize()
                content_type = obj.image.contentType

            result = {
                "type": content_type,
                "size": size
            }
        else:
            try:
                size = obj.getSize()
            except AttributeError:
                size = obj.getObjSize()

            result = {
                "type": obj.getContentType(),
                "size": size
            }

        if tusrequest:
            tus.cleanup_file()
        result.update({
            'url': obj.absolute_url(),
            'name': obj.getId(),
            'UID': IUUID(obj),
            'filename': filename
        })
        return json.dumps(result)
Beispiel #6
0
    def __call__(self):
        req = self.request
        tusrequest = False
        if TUS_ENABLED:
            adapter = Zope2RequestAdapter(req)
            tus = Tus(adapter, **tus_settings)
            if tus.valid:
                tusrequest = True
                tus.handle()
                if not tus.upload_finished:
                    return
                else:
                    filename = req.getHeader('FILENAME')
                    if tus.send_file:
                        filedata = req._file
                        filedata.filename = filename
                    else:
                        filepath = req._file.read()
                        filedata = open(filepath)
        if not tusrequest:
            if req.REQUEST_METHOD != 'POST':
                return
            filedata = self.request.form.get("file", None)
            if filedata is None:
                return
            filename = filedata.filename
        content_type = mimetypes.guess_type(filename)[0] or ""

        if not filedata:
            return

        # Determine if the default file/image types are DX or AT based
        ctr = getToolByName(self.context, 'content_type_registry')
        type_ = ctr.findTypeName(filename.lower(), '', '') or 'File'

        DX_BASED = False
        if HAS_DEXTERITY:
            pt = getToolByName(self.context, 'portal_types')
            if IDexterityFTI.providedBy(getattr(pt, type_)):
                factory = IDXFileFactory(self.context)
                DX_BASED = True
            else:
                factory = IATCTFileFactory(self.context)
        else:
            factory = IATCTFileFactory(self.context)

        obj = factory(filename, content_type, filedata)

        if DX_BASED:
            if 'File' in obj.portal_type:
                size = obj.file.getSize()
                content_type = obj.file.contentType
            elif 'Image' in obj.portal_type:
                size = obj.image.getSize()
                content_type = obj.image.contentType

            result = {"type": content_type, "size": size}
        else:
            try:
                size = obj.getSize()
            except AttributeError:
                size = obj.getObjSize()

            result = {"type": obj.getContentType(), "size": size}

        if tusrequest:
            tus.cleanup_file()
        result.update({
            'url': obj.absolute_url(),
            'name': obj.getId(),
            'UID': IUUID(obj),
            'filename': filename
        })
        return json.dumps(result)