我想讓用戶通過點擊「下載」按鈕來下載特定文件。該按鈕將與許多切換器連接,因此我編寫了一個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定義)。我知道我的問題很密集,但我真的需要這個幫助。任何例子都將不勝感激。謝謝。
謝謝您的回答快,當我改變我的STATIC_URL「/靜態/」,因爲畢竟這一行'文件名= staticfiles_storage.url(FILE_NAME)'它不工作,也不會找到正確的文件。我得到這個錯誤_沒有這樣的文件或目錄:'/static/example.csv_'。並沒有找到一個解決方案'filename = full_path_to_static(file_name)'。@ Yoganand –
STATIC_URL是打開瀏覽器靜態文件的前綴url。你不能閱讀這個路徑的文件。爲了讀取文件,您需要指定完整路徑,您可以從settings.BASE_DIR中獲取它。或PROJECT_ROOT。 – Yoganand
我剛剛打印了我的BASE_DIR,它是:_「/ home/user/xxxx/xxx/project」_。如何添加缺少的部分_「/ my_app/static /」_? 。我需要的東西給了我_「/ home/user/xxxx/xxx/project/my_app/static /」_ @ Yoganand –