2013-03-21 150 views
2

我正在Python中實現一個簡單的上傳處理程序,它將上傳的文件分塊地讀入內存,GZips並對它們進行簽名,並將它們重新上傳到另一臺服務器進行長期存儲。我已經設計了一種方法來讀取與我的Web服務器塊上傳,而且基本上我有一個這樣的工作流程:流媒體上傳請求?

class MyUploadHandler: 

    def on_file_started(self, file_name): 
     pass 

    def on_file_chunk(self, chunk): 
     pass 

    def on_file_finished(self, file_size): 
     pass 

這部分的偉大工程。

現在我需要將文件分塊上傳到最終目的地,然後對它們進行修改。我正在尋找一個這樣的工作流程:

import requests 

class MyUploadHandler: 

    def on_file_started(self, file_name): 
     self.request = requests.put("http://secondaryuploadlocation.com/upload/%s" % 
       (file_name,), streaming_upload = True) 

    def on_file_chunk(self, chunk): 
     self.request.write_body(transform_chunk(chunk)) 

    def on_file_finished(self, file_size): 
     self.request.finish() 

有沒有辦法使用Python請求庫來做到這一點?看起來好像是they allow for file-like upload objects可以閱讀,但我不確定這是什麼意思,以及如何將其應用於我的情況。我如何提供這樣的流式上傳請求?

+0

您需要[分塊上傳發生器]提供一種(實施例代碼http://docs.python-requests.org/en/最新/用戶/高級/#塊編碼請求),但是*拉*數據;你的代碼想要推動。我想,它需要一個單獨的線程和一個隊列。 – 2013-03-21 21:12:54

+0

關於從哪裏開始的任何想法?我的Python線程不太好。 – 2013-03-21 21:18:15

+0

這部分取決於您正在使用的Web框架以及它如何處理併發。 – 2013-03-21 21:25:07

回答

0

我會建議使用Python的多處理模塊。您可以使用該模塊中的apply_async例程在完成時上載每個塊,而不會影響其他上載。然後,您可以將它們放入臨時文件夾中,並在上傳事件完成後,將它們縫合在一起。

0

下面的回答類似的問題應該可以解決你的問題:

問:「如何流POST數據到Python的請求」

A:使用queuethreadingiter()前哨

https://stackoverflow.com/a/40018547/19163

+0

這應該是一個評論,而不是一個答案。如果這是一個重複的問題,那麼[投票結束](http://stackoverflow.com/help/privileges/close-questions)本身和/或留下評論,一旦你[賺](http://meta.stackoverflow .com/q/146472)夠[聲望](http://stackoverflow.com/help/whats-reputation)。如果問題不是重複的,那麼定製這個具體問題的答案。 – 2016-10-14 06:56:51

+0

我認爲將它標記爲重複會太苛刻,但我會按照你的建議去做。 – vog 2016-10-14 06:58:38