Ну, я нашел два решения, если кому-то интересно.
Первый - это чисто Python способ сделать это, который умеренно успешен.
with BufferedReader( BytesIO( request.raw_post_data ) ) as stream:
with BufferedWriter( FileIO( "/tmp/foo.bar", "wb" ) ) as destination:
foo = stream.read( 1024 )
while foo:
destination.write( foo )
foo = stream.read( 1024 )
Он работал при тестировании небольших файлов (до 20 МБ), но не удался, когда я попробовал его с ISO (~ 600 МБ) или большими файлами.Я ничего не пробовал между 20 МБ и 600 МБ, поэтому не уверен, где находится точка останова.Я скопировал нижнюю часть трассировки ниже, я не уверен, что корень проблемы в этой ситуации.Казалось, что была проблема с памятью, но у меня было достаточно RAM + swap для трехкратного хранения файла, поэтому я не был уверен, почему возникла проблема.Не уверен, что использование других форм Python для чтения / записи или без использования буферов могло бы помочь здесь.
[error] [client 127.0.0.1] File "/usr/local/lib/python2.6 /dist-packages/django/core/handlers/wsgi.py", line 69, in safe_copyfileobj, referer: http://localhost/project/
[error] [client 127.0.0.1] buf = fsrc.read(min(length, size)), referer: http://localhost/project/
[error] [client 127.0.0.1] TemplateSyntaxError: Caught IOError while rendering: request data read error, referer: http://localhost/project/
Требуется решение, которое работает со всем, что я на него брошу, по крайней мере, до 2 ГБ файловДжанго 1.3.Они добавили файловую поддержку для чтения непосредственно из HttpRequest, поэтому я воспользовался этим.
with BufferedWriter( FileIO( "/tmp/foo.bar", "wb" ) ) as destination:
foo = request.read( 1024 )
while foo:
destination.write( foo )
foo = request.read( 1024 )