[python] Upload velkeho souboru

Jirka Vejrazka jirka.vejrazka na gmail.com
Úterý Září 28 17:44:28 CEST 2010


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 <slush at centrum.cz> 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
>


Další informace o konferenci Python