2017-04-21 48 views
0

我想讓用戶通過點擊「下載」按鈕來下載特定文件。該按鈕將與許多切換器連接,因此我編寫了一個JS腳本,用於更改「標記」以指向正確的靜態文件。Django/JS - 將文件發送給用戶,稱爲下載功能

我試圖遵循很多stackoverflow的問題,並閱讀有關Django靜態文件,媒體文件的文檔,但不明白我需要做什麼我的情況。任何幫助將非常感激,請讓我介紹一下我所做的並請求您的幫助/意見。

我不想讓人們下載中可以找到文件:

"/home/user/xxxx/xxx/project/my_app/static/" 

這是我在views.py功能:

def send_file(request,file_name): 
from django.contrib.staticfiles.storage import staticfiles_storage 
import os 
from wsgiref.util import FileWrapper 
import mimetypes 

filename = staticfiles_storage.url(file_name) 
download_name = file_name 
wrapper = FileWrapper(open(filename)) 
content_type = mimetypes.guess_type(filename)[0] 
response = HttpResponse(wrapper, content_type=content_type) 
response['Content-Length'] = os.path.getsize(filename) 
response['Content-Disposition'] = "attachment; filename=%s" % download_name 
return response 

我需要的確切路徑打開文件,所以我所做的是我定義了我的設置STATIC_URL = "/home/user/xxxx/xxx/project/my_app/static/" 。我不喜歡這個解決方案,因爲在它之後,如果你檢查我的源代碼,你就有我的項目的確切路徑。如果我定義STATIC_URL = "static/"它不起作用。我尋找一種方法來獲取靜態文件的確切路徑,但它不起作用。對這部分有幫助嗎?

urls.py

url(r'^download/static/(?P<file_name>[\w.]{0,256})$',views.send_file, name='send_file'), 

template.html,只是按鍵部分:

<a href="#" class="button" id="dl-link">Download</a> 

JS,只有一部分,當你點擊一個切換器,它會更改HTML按鈕的href標記:

"if you click on a switcher" 
id = switcher-checked 
var atag = document.getElementById("dl-link");  
var url = "http://localhost:8000/test/download/static/"+id+".csv";   
atag.setAttribute("href",url); 

有沒有解決方案在我的JS中使用{%url'my_app:send_file%}標記?我發現一種解決方案是將腳本直接放在「template.html」中,這是一個好的行爲嗎?

我的下載工作完美,但我覺得我所有的選擇都很糟糕(STATIC_URL和JS var url定義)。我知道我的問題很密集,但我真的需要這個幫助。任何例子都將不勝感激。謝謝。

回答

0

幾點。第一個用於STATIC_URL,您可以使用「/ static /」開始和結束使用斜槓而不是完整路徑。因爲您正在嘗試從相同的域名下載,所以無需使用完整的URL「http://localhost:8000/your-url」。你可以簡單地在js var url變量中使用「/ your-url」。

Django無法呈現js文件,因此我們只有一個選項,將其保存在template.html中。爲了更好地維護js代碼,請嘗試使用文檔加載模板中的urls聲明全局變量,並在腳本中使用它們。這樣腳本部分就會清晰。爲前,

var all_my_urls = { 
"url":"{% url 'my_app:send_file'%}" 
} 
+0

謝謝您的回答快,當我改變我的STATIC_URL「/靜態/」,因爲畢竟這一行'文件名= staticfiles_storage.url(FILE_NAME)'它不工作,也不會找到正確的文件。我得到這個錯誤_沒有這樣的文件或目錄:'/static/example.csv_'。並沒有找到一個解決方案'filename = full_path_to_static(file_name)'。@ Yoganand –

+0

STATIC_URL是打開瀏覽器靜態文件的前綴url。你不能閱讀這個路徑的文件。爲了讀取文件,您需要指定完整路徑,您可以從settings.BASE_DIR中獲取它。或PROJECT_ROOT。 – Yoganand

+0

我剛剛打印了我的BASE_DIR,它是:_「/ home/user/xxxx/xxx/project」_。如何添加缺少的部分_「/ my_app/static /」_? 。我需要的東西給了我_「/ home/user/xxxx/xxx/project/my_app/static /」_ @ Yoganand –

相關問題