2017-06-21 191 views
0

因此,我面臨的問題是試圖讓我們的Web服務器導出爲CSV按鈕工作,一個要求是文件無法在本地保存,必須直接傳輸到客戶端。目前,我只是試圖從服務器上獲取基本的CSV文件流並保存在本地計算機上,然後才擔心渲染實際數據。使用StreamingHttpResponse流式傳輸和下載大型CSV文件

所以,我有,按鈕上點擊一個職位,我的意見,我想渲染然後返回一個響應。這是一個$就功能,但在測試過程中我已經改變了,因爲它和它現在看起來,這看起來像:

$("#exportbutton").click(function(e){ 
    $.post("{% url 'doner:download' %}", function(data) 
    { 
     console.log(data); 
    }); 
    }) 

視圖中的代碼看起來是這樣的(這恰好是一個一個CTRL + V例如,從SO):

def download(request): 
    def stream(): 
     buffer_ = io.StringIO() 
     writer = csv.writer(buffer_) 
     for row in rows: 
      writer.writerow(row) 
      buffer_.seek(0) 
      data = buffer_.read() 
      buffer_.seek(0) 
      buffer_.truncate() 
      yield data 

    response = StreamingHttpResponse(
     stream(), content_type='text/csv' 
    ) 
    disposition = "attachment; filename=file.csv" 
    response['Content-Disposition'] = disposition 

    return response 

所以經過大量的擺弄這是據我已經得到了,就會「流」()將數據返回到HTML頁面中,執行console.log將輸出? '文件'數據,但是我沒有得到任何形式的文件或下載,只是數據控制檯中的日誌。

我不知道我是否理解了StreamingHttpResponse是如何工作的,我打算在客戶端做更多的事情,以便通過流下載它,但是我已經閱讀了文檔,我也沒有更多明確。

任何幫助將不勝感激,因爲我難倒,歡呼傢伙!

回答

0

我正面臨的問題是使用jQuery發佈,顯然瀏覽器無法使用AJAX下載文件,所以爲了修復這部分並獲取文件下載,我所做的只是在AJAX中(確保它得到它的下載之前)添加一行location.replace('doner/download');產生好吧,就是這樣......

現在的jQuery看起來是這樣的:

$("#exportbutton").click(function(e){ 
    $.post("{% url 'doner:download' %}", function(data) 
    { 
     console.log(data); 
     location.replace("{% url 'doner:download' %}"); 
    }); 
    }) 

,並根據需要一切正常!