[python] Upload velkeho souboru

slush slush na centrum.cz
Úterý Září 28 20:09:44 CEST 2010


Ahoj Jirko,

pokud vim, tak Django resi pouze prijem souboru, ale nikde nevystupuje jako
sitovy klient. Koukal jsem do django/core/files a nechal prohledat zdrojaky
na PUT / POST a zadny relevantni kod jsem bohuzel opravdu nenasel.

Kazdopadne jsem nasel jeden storage backend pro Django, ktery resi ten samy
problem a nasel jsem modul "Poster" (
http://pypi.python.org/pypi/poster/0.6.0). Takze jeste jsem to nezkousel,
ale problem je zrejme vyresen. Jenom jsem rozcarovan, ze http streaming
neresi pythoni standardni knihovna (co vim, tak ani nove moduly pro Python3)
a ze budu nutit uzivatele instalovat dalsi externi balik. Pravdepodobne
zkombinuju mmap a poster ("chcete podporu extra velkych souboru?
Doinstalujte si Poster").

Marek

2010/9/28 Jirka Vejrazka <jirka.vejrazka na gmail.com>

> 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 na 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
> >
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
------------- dal?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://www.py.cz/pipermail/python/attachments/20100928/1aaef23a/attachment.html>


Další informace o konferenci Python