Python ile dosya indirme hizmet

3 Cevap php

Çete Hey, python üzerinde eski bir php komut dosyası dönüştürmek için çalışıyor ve daha fazla şans sahip değilim.

Senaryonun amacı bu kökeni gizlerken, bir dosya kadar hizmet etmektir. İşte php çalışıyor ne:

<?php
$filepath = "foo.mp3";

$filesize = filesize($filepath);

header("Pragma: no-cache");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

// force download dialog
//header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

header('Content-Disposition: attachment;filename="'.$filepath.'"');

header("Content-Transfer-Encoding: binary");

#header('Content-Type: audio/mpeg3');
header('Content-Length: '.$filesize);

@readfile($filepath);
exit(0);
?>

Ben Python equivilent yaptığınızda, sıfır bayt bir download olsun. İşte ben çalışıyorum ne:

#!/usr/bin/env python
# encoding: utf-8

import sys
import os
import cgitb; cgitb.enable()

filepath = "foo.mp3" 
filesize = os.path.getsize(filepath)

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-Type: application/download"

print 'Content-Disposition: attachment;filename="'+filepath+'"'

print "Content-Transfer-Encoding: binary"

print 'Content-Length: '+str(filesize)

print  #required blank line

open(filepath,"rb").read()

Herkes bana yardım edebilir misiniz?

3 Cevap

Eh, belki sadece bana bir şey eksik, ama ... Aslında stdout dosyasının içeriğini yazmak değildir. Sadece belleğe okuyorsunuz, bu yüzden TCP bağlantısı diğer tarafında göstermek asla ...

Deneyin:

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

Dosya boyutuna bağlı olarak, bu yüzden gibi, parçalar halinde dosyayı okumak için daha iyi olabilir:

chunk_size = 4096
handle = open(filepath, "rb")

while True:
    buffer = handle.read(chunk_size)
    if buffer:
        sys.stdout.write(buffer)
    else:
        break

Farkında olmak başka bir şey: Stdout'a ikili veri yazma Python nedeniyle kodlama sorunları boğması neden olabilir. Bu kullandığınız Python sürümüne bağlıdır.

HTTP başlıklarını "\ r \ n" ile sonlandırılması gerekir, oysa bu sadece bir sorun olup olmadığını bilmiyorum ama python print deyimi "\ n" ile satırları sonlandırır

Sen urllib seti ve başlıkları ile çalışmak için kontrol etmelisiniz. Here's a small example bu yapar.