Hochladen großer Dateien mit Httplib, Urllib(2)
Verfasst: Samstag 31. Dezember 2011, 09:37
Hallo zusammen,
ich arbeite momentan an einer Erweiterung von Duplicity, einem Backupprogramm. Die Erweiterung erlaubt es Backups bei Rapidshare zu machen.
Zum Upload der Dateien nutze ich momentan httlib, was mit Dateien bis 512 MB auch noch funktioniert. Bei Dateien mit 1Gb hängt sich das Script leider mit einem Memory-Error weg. Das ist auch absolut verständlich, da ja nur 2.2 Gb / Prozess allokiert werden können und wg einer Kopie des 1Gb-Strings und einer Übergabe in ein Unterprogramm diese Grenzen verletzt werden.
Meine Frage:
- Gibt es eine Möglichkeit das elegant per httplib / urllib / urllib2 zu lösen ohne sich jedes Mal den Arbeitsspeicher vollzuknallen?
Code:
ich arbeite momentan an einer Erweiterung von Duplicity, einem Backupprogramm. Die Erweiterung erlaubt es Backups bei Rapidshare zu machen.
Zum Upload der Dateien nutze ich momentan httlib, was mit Dateien bis 512 MB auch noch funktioniert. Bei Dateien mit 1Gb hängt sich das Script leider mit einem Memory-Error weg. Das ist auch absolut verständlich, da ja nur 2.2 Gb / Prozess allokiert werden können und wg einer Kopie des 1Gb-Strings und einer Übergabe in ein Unterprogramm diese Grenzen verletzt werden.
Meine Frage:
- Gibt es eine Möglichkeit das elegant per httplib / urllib / urllib2 zu lösen ohne sich jedes Mal den Arbeitsspeicher vollzuknallen?
Code:
Code: Alles auswählen
...
fields = ('sub', 'upload'), ('login', self.parsed_url.username), ('password', self.get_password()), ('folder', self.__getFolderID())
file = 'filecontent', remote_filename, str(source_file.read()) # Source_file ist sehr groß!
content_type, body = self.__encode_multipart_formdata(fields, file)
connection = httplib.HTTPSConnection('rs'+rs_uploadserverID+'.rapidshare.com', 443)
connection.request('POST', "/cgi-bin/rsapi.cgi", body, headers)
response = connection.getresponse()
...
def __encode_multipart_formdata(self, fields, files):
"""
fields is a sequence of (name, value) elements for regular form fields.
files is a sequence of (name, filename, value) elements for data to be uploaded as files
Return (content_type, body) ready for httplib.HTTP instance
"""
BOUNDARY = '----------632865735RS4EVER5675865'
CRLF = '\r\n'
L = []
for (key, value) in fields:
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s"' % key)
L.append('')
L.append(value)
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (files[0], files[1]))
L.append('Content-Type: %s' % self.__get_content_type(files[1]))
L.append('')
L.append(files[2])
L.append('--' + BOUNDARY + '--')
L.append('')
########
# Save some memory!
del files
files = ''
gc.collect()
########
body = CRLF.join(L)
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
return content_type, body