2013-05-09 23 views
5

Cherrypy kullanarak bir video dosyası yayınlamaya çalışıyorum. localhost: 8080/stream? Video = video.avi'a gittiğimde indirmeye başlar, ancak birkaç saniye sonra dosya ne kadar büyük olursa olsun indirme işlemini "tamamlar". Bunun için oldukça yeniyim ve bunu neden yaptığını bulamıyorum. Ayrıca, neden Matroska (.mkv) ise dosyayı tanımıyor?Cherrypy ile akış dosyaları

class Stream(object): 
@cherrypy.expose 
def default(self, video=None): 
    BASE_PATH = ".." 
    video = os.path.join(BASE_PATH, video) 
    if video == None: 
     return "no file specified!" 
    if not os.path.exists(video): 
     return "file not found!" 
    f = open(video) 
    size = os.path.getsize(video) 
    mime = mimetypes.guess_type(video)[0] 
    print(mime) 
    cherrypy.response.headers["Content-Type"] = mime 
    cherrypy.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(video) 
    cherrypy.response.headers["Content-Length"] = size 

    BUF_SIZE = 1024 * 5 

    def stream(): 
     data = f.read(BUF_SIZE) 
     while len(data) > 0: 
      yield data 
      data = f.read(BUF_SIZE) 

    return stream() 
default._cp_config = {'response.stream': True} 

cevap

2

Ben ikili dosyayı okumak böylece yapmam için gerekli tüm (video, 'rb') açmak için open (video) değiştirmek olduğunu fark: Burada

benim Akış sınıftır modu. Bundan sonra dosya tamamen indirildi ve çalıştı.

+0

Benzer bir şey yapmak. Ayrıca, arabelleğe alma sırasında bir tür duraklama elde etmek ve aynı zamanda, arabellek boyutu karşılandıktan sonra kaynağın indirilmeye devam etmeyeceğinden emin olmak. – Twisty