簡體   English   中英

python龍卷風下載遠程文件

[英]python tornado download remote file

我想下載一個遠程文件並提供文件名。 如果文件在我們的服務器上,則此方法有效。 但這不適用於遠程文件並以somerandomname.pdf下載

<a href="http://file.com/somerandomname.pdf" download="mypdf.pdf">DOWNLOAD</a>

現在我嘗試在python處理程序中下載它。 它可以工作並下載我想要的文件名。 但是問題是我只能在瀏覽器中看到下載的文件,而下載已完成。 我在瀏覽器中看不到下載過程。 它只是在后端加載遠程文件。 有沒有辦法解決這個問題?

def get(self):
    url = self.get_argument('url')
    filename = self.get_argument('filename')
    self.set_header('Content-Type', 'application/octet-stream')
    self.set_header('Content-Disposition', 'attachment; filename=%s' % filename)
    f = urllib2.urlopen(url)
    self.write(f.read())
    self.finish()
  1. 調用set_header()不會立即發送標頭; 在調用flush()finish()之前,它們不會被發送(除其他事項外,如果在調用flush()之前引發了異常,這使得有可能用錯誤頁面替換輸出)

  2. 即使您調用flush() ,在調用urlopen()也會阻塞整個服務器。 這是一個阻塞調用,必須在Tornado中將其替換為異步版本(有關更多信息,請參見用戶指南 )。 Tornado提供了一個異步HTTP客戶端,可以代替urlopen()

     @gen.coroutine def get(self): url = self.get_argument('url') filename = self.get_argument('filename') self.set_header('Content-Type', 'application/octet-stream') self.set_header('Content-Disposition', 'attachment; filename=%s' % filename) self.flush() response = yield AsyncHTTPClient().fetch(url) self.finish(response.body) 
  3. 此過程將整個遠程文件立即加載到內存中,並且直到從遠程服務器讀取了整個文件之后,才將其發送到瀏覽器。 如果文件很大,您可能希望分塊讀取它,並在讀取文件時將它們發送回客戶端:

     # inside get() as above, after self.flush(): def streaming_callback(chunk): self.write(chunk) self.flush() yield AsyncHTTPClient().fetch(url, streaming_callback=streaming_callback) self.finish() 

暫無
暫無

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

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