Dienen binäre Datei, die vom Webserver an den client
In der Regel, wenn ich will, zu übertragen, eine web-server-text-Datei zu client, hier ist was ich getan habe
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
Funktioniert sehr gut für ANSI-Datei. Jedoch, sagen wir, ich habe eine binäre Datei a.exe
(Diese Datei ist im web-server-Geheimnis-Pfad, und der user hat keinen direkten Zugriff auf die Verzeichnis-Pfad). Möchte ich verwenden eine ähnliche Methode für die übertragung. Wie kann ich das tun?
- Welcher content-Typ sollte ich verwenden?
- Mit print zu haben scheint beschädigt Inhalt erhielt auf der client-Seite. Was ist die richtige Methode?
Ich den folgenden code verwenden.
#!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
Allerdings, wenn ich vergleichen Sie die heruntergeladene Datei mit der Originaldatei, es scheint, es ist ein extra Leerzeichen (oder mehr) für die nach jeder einzelnen Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stimme dem obigen Poster zu 'rb' und Content-Type-Header.
Zusätzlich:
Könnte dies ein problem bei der Begegnung mit
\n
oder\r\n
bytes im Binär-Datei. Es könnte besser sein, so etwas zu tun:Vorausgesetzt, dies ist unter windows in einer CGI-Umgebung, werden Sie wollen, starten Sie den python-Prozess mit der
-u
argument, dies sicherzustellen, dass stdout nicht im text-ModusBeim öffnen einer Datei, die Sie verwenden können
open(filename, 'rb')
- das 'b' flag markiert Sie als binäre. Für einen Allgemeinen handler, Sie könnte verwenden irgendeine form von mime-magic (ich bin nicht vertraut mit der Verwendung von Python, ich habe immer nur verwendet es für PHP ein paar Jahren). Für den speziellen Fall,.exe
istapplication/octet-stream
.print
sondern übersys.stdout.write
(ich hatte schon zu erwähnen, es aber vergessen). Ich nicht die Mühe Aktualisierung meiner Antwort auf die Liste.Content-type
.exe
ist typischapplication/octet-stream
.Möchten Sie vielleicht Lesen Sie Ihre Datei mit
open(filename, 'rb')
wob
bedeutet binäre.Zu vermeiden, die whitespace-problem, könnten Sie versuchen, mit:
oder sogar besser, je nach Größe der Datei, verwenden Sie die Knio Ansatz:
Für alle, die mit Windows Server 2008 oder 2012 und Python 3, hier ein update...
Nach vielen Stunden des Experimentierens habe ich festgestellt, die folgenden arbeiten zuverlässig: