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()

何百万もの異なるヘッダーを試したので、ヘッダーには何もないようです.強制ダウンロードなど...しかし、何も起こりません..

4

1 に答える 1

2

print 出力にはすでに改行が含まれています。sys.stdout代わりに使用し、ヘッダーを 1 つだけ記述します Content-Typeヘッダーの後に、もう 1 つだけ\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

プロキシされたリクエストをストリーミングするには、ファイル オブジェクトを使用してwith.rawに渡します。sys.stdoutshutil.copyfileobj

import shutil

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

Pythonがその時点で終了し、stdout閉じるときにフラッシュする場合ではなく、フラッシュが必要だとは思いません。

于 2013-09-21T12:49:03.047 に答える