2012-03-16 41 views
3

我有一個django視圖,我想返回一個Excel文件。該代碼是下面:在HttpResponse中返回一個python bytearray

def get_template(request, spec_pk): 
    spec = get_object_or_404(Spec, pk=spec_pk) 

    response = HttpResponse(spec.get_template(), mimetype='application/ms-excel') 
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name 
    return response 

在該例子中,​​類型是<type 'bytearray'>包含Excel電子表格的二進制數據。

問題是,當我嘗試下載該視圖並使用Excel打開它時,它以混亂的二進制數據形式出現。我知道bytearray是正確的,雖然,因爲如果我做到以下幾點:

f = open('temp.xls', 'wb') 
f.write(spec.get_template()) 

我可以在Excel中打開temp.xls完美。

我甚至只要修改我的觀點來了:

def get_template(request, spec_pk): 
    spec = get_object_or_404(Spec, pk=spec_pk) 
    f = open('/home/user/temp.xls', 'wb') 
    f.write(spec.get_template()) 
    f.close() 

    f = open('/home/user/temp.xls', 'rb') 
    response = HttpResponse(f.read(), mimetype='application/ms-excel') 
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name 
    return response 

和它的作品perfectly-我可以打開從瀏覽器到Excel XLS文件,並一切正常。

所以我的問題是:在將其傳遞給HttpResponse之前,我需要做什麼bytearray。爲什麼將它保存爲二進制文件,然後重新打開它的工作是完美的,但通過bytearray本身會導致數據亂碼?

+0

*如何*它是亂碼? – 2012-03-16 03:35:31

+0

這是一個亂碼的單個ASCII文本,非常非常長。 – dgel 2012-03-16 03:37:09

+0

根據'file':'ASCII文本,很長的行,沒有行結束符' – dgel 2012-03-16 03:37:29

回答

1

好吧,通過完全隨機(而且非常持久)的試驗和錯誤,我找到了一個使用python binascii模塊的解決方案。

這工作:

response = HttpResponse(binascii.a2b_qp(spec.get_template()), mimetype='application/ms-excel') 

根據Python文檔爲binascii.a2b_qp

轉換引用可打印數據爲二進制的塊並返回二進制數據。一次可以傳遞多個行。如果可選參數頭存在且爲true,則下劃線將被解碼爲空格。

很想有人告訴我爲什麼把它保存爲二進制文件,然後重新打開它的工作。