[python] Upload velkeho souboru
slush
slush na centrum.cz
Úterý Září 28 16:00:39 CEST 2010
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?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://www.py.cz/pipermail/python/attachments/20100928/a7da46f4/attachment.html>
Další informace o konferenci Python