2013-09-21 2 views
0

Я пытаюсь создать что-то вроде прокси (в PYTHON) для загрузки, и я получаю сообщение об ошибке. Я хочу заставить пользователя загружать файл, но вместо этого он печатает (двоичный код) на экране. Вот мой код: Что я делаю ... загрузка файла с другого сервера и попытка отправить этот файл клиенту. Так что-то вроде этого: REMOTE_SERVER -> MY_SERVER -> CLIENT без сохранения файла на моем сервере. Кто-нибудь может помочь, что я делаю неправильно?Как принудительно загрузить клиенту .. печатает в браузере

myfile = session.get(r.headers['location'], stream = True) 
print "Content-Type: application/zip\r\n" 
print "Prama: no-cache\r\n" 
print "Expires: 0\r\n" 
print "Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n" 
print "Content-Type: application/octet-stream\r\n" 
print "Content-Type: application/download\r\n" 
print "Content-Disposition: attachment; filename=ternos.205.zip\r\n" 
print "Content-Transfer-Encoding: binary\r\n" 
print "Content-Length: 144303765\r\n" 

#print "Accept-Ranges: bytes\r\n" 
print ("\r\n\r\n") 
#with open('suits.zip', 'wb') as f: 
for chunk in myfile.iter_content(chunk_size=1024): 
    if chunk: 
     sys.stdout.write(chunk) 
     sys.stdout.flush() 

Кажется, что ничего с заголовками согом Я попытался миллионы различных заголовков .. принудительная загрузка и т.д ... но ничего не происходит ..

ответ

2

printуже включает в себя символ новой строки в выход. Вместо этого используйте sys.stdout, и напишите только Content-Type header. После заголовков напишите только один еще \r\n комбо.

import sys 

# ... 
sys.stdout.write("Content-Type: application/zip\r\n") 
sys.stdout.write("Prama: no-cache\r\n") 
sys.stdout.write("Expires: 0\r\n") 
sys.stdout.write("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n") 
sys.stdout.write("Content-Type: application/octet-stream\r\n") 
sys.stdout.write("Content-Disposition: attachment; filename=ternos.205.zip\r\n") 
sys.stdout.write("Content-Transfer-Encoding: binary\r\n") 
sys.stdout.write("Content-Length: 144303765\r\n") 
sys.stdout.write("\r\n") 

Большинство реализаций CGI фактически будет переводить регулярные \n в \r\n для вас, так что вы могли просто напечатать заголовки без добавления разделителей:

print "Content-Type: application/zip" 
print "Prama: no-cache" 
print "Expires: 0" 
print "Cache-Control: must-revalidate, post-check=0, pre-check=0" 
print "Content-Type: application/octet-stream" 
print "Content-Disposition: attachment; filename=ternos.205.zip" 
print "Content-Transfer-Encoding: binary" 
print "Content-Length: 144303765" 
print 

Для затем потокового проксируемым запрос, я используйте файл .raw и передайте его до sys.stdout с shutil.copyfileobj:

import shutil 

shutil.copyfileobj(myfile.raw, sys.stdout) 

Сомневаюсь, что необходим флеш, если не будет выхода Python в этот момент и сбрасывается stdout по закрытию.

+0

По-прежнему с той же проблемой ... Я пробовал миллионы вещей ... по мере того, как я развиваюсь, я пытаюсь использовать localhost .. вы думаете, что это может быть причиной? –

+0

Нет, я не думаю, что это имеет значение. Вы пытались использовать более ручной инструмент, чтобы узнать, какие заголовки возвращаются? Что такое 'telnet localhost ', а затем 'GET/path/to/script HTTP/1.0' plus double newline дает вам? –

+0

Я просто использовал данные тампера и не отправлял заголовки ... возвращает нормальный заголовок html .. но в то же время я не вижу ошибки в своих заголовках –

Смежные вопросы