Ahoj, Ja ted nejsem u pocitace, ale podival bych se jak to resi Django a podobne. Jelikoz je pod BSD licenci, tak neni problem to reseni okopirovat, pokud bude pouzitelne.
Jirka On 28/09/2010, slush <[email protected]> wrote: > Zdravim, > > resim uz pekelne dlouho problem, jak z Pythonu uploadovat velky soubor pres > PUT/POST - pokud mozno nejakym standardnim zpusobem. > > Problem jsem zatim vyresil pomoci mmap. Nelibi se mi ale, ze na 32bit > systemech je maximalni velikost uploadovaneho souboru ~4GB. Zaroven jsem ale > neprisel na to, jak donutit urllib2, aby s daty pracovala jako se streamem > (file-like objektem) a ne jako se stringem. Posledni napad je napsat si > 'string-like object', ktery bude doopravdy soubor a nemapovat cely jeho > obsah na pamet (jako dela mmap), ale seekovat a nejak to cist do bufferu. > Prijde mi ale dost divne, ze by neexistovalo jednodussi reseni. > > Soucasna implementace je nasledujici: > > from urllib2 import Request, urlopen > > @classmethod > def _f2b(cls, f, size=None): > ''' > Map files into memory and act as buffer. > ''' > if isinstance(f, basestring): > # No conversion needed > return f > elif getattr(f, 'fileno', None): > # Map to memory > if size == None: > # When size is already known, skip this > f.seek(0, os.SEEK_END) > size = f.tell() > f.seek(0) > return mmap.mmap(f.fileno(), size) > else: > raise fs.errors.UnsupportedError("Cannot handle type %s" % > type(f)) > > @classmethod > def put(cls, path, data, size=None): > class PutRequest(Request): > def __init__(self, *args, **kwargs): > self.get_method = lambda: 'PUT' > Request.__init__(self, *args, **kwargs) > > data = cls._f2b(data, size=size) > req = PutRequest(''.join([cls.webapi, path]), data, > headers=cls.headers) > return urlopen(req) > > > Diky za kazdou radu. > > Marek > _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
