簡體   English   中英

從Web服務器向客戶端提供二進制文件

[英]Serving binary file from web server to client

通常,當我要將Web服務器文本文件傳輸到客戶端時,這就是我所做的

import cgi

print "Content-Type: text/plain"
print "Content-Disposition: attachment; filename=TEST.txt"
print

filename = "C:\\TEST.TXT"
f = open(filename, 'r')
for line in f:
    print line

對於ANSI文件,效果很好。 但是,例如,我有一個二進制文件a.exe (此文件位於Web服務器機密路徑中,並且用戶不得直接訪問該目錄路徑)。 我希望使用類似的方法進行轉移。 我該怎么做?

  • 我應該使用哪種內容類型?
  • 使用打印似乎已損壞了客戶端接收到的內容。 正確的方法是什么?

我使用以下代碼。

#!c:/Python27/python.exe -u

import cgi

print "Content-Type: application/octet-stream"
print "Content-Disposition: attachment; filename=jstock.exe"
print

filename = "C:\\jstock.exe"
f = open(filename, 'rb')
for line in f:
    print line

但是,當我將下載的文件與原始文件進行比較時,似乎每行之后都有一個額外的空格(或更多)。

替代文字

同意以上關於“ rb”和Content-Type標頭的張貼者。

另外:

for line in f:
    print line

在二進制文件中遇到\\n\\r\\n字節時,這可能是一個問題。 最好執行以下操作:

import sys
while True:
    data = f.read(4096)
    sys.stdout.write(data)
    if not data:
        break

假設它在CGI環境中的Windows上運行,您將要使用-u參數啟動python進程,這將確保stdout不在文本模式下

.exe內容類型通常是application/octet-stream
您可能想使用open(filename, 'rb')讀取open(filename, 'rb')其中b表示二進制。

為避免空白問題,您可以嘗試:

sys.stdout.write(open(filename,"rb").read())
sys.stdout.flush()

甚至更好,取決於文件的大小,請使用Knio方法:

fo = open(filename, "rb")
while True:
    buffer = fo.read(4096)
    if buffer:
        sys.stdout.write(buffer)
    else:
        break
fo.close()

打開文件時,可以使用open(filename, 'rb') -'b'標志將其標記為二進制。 對於一般處理程序,您可以使用某種形式的mime魔術(我不熟悉從Python使用它,幾年前我才從PHP使用過它)。 對於特定情況, .exeapplication/octet-stream

對於使用Windows Server 2008或2012和Python 3的任何人,這是一個更新...

經過數小時的試驗,我發現以下各項工作可靠:

import io

with io.open(sys.stdout.fileno(),"wb") as fout:
    with open(filename,"rb") as fin:
        while True:
            data = fin.read(4096)
            fout.write(data)
            if not data:
                break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM