Django python upload File
完成畫面 |
前端 Templates
<form id="upload_file_form"
action="{% url myWeb.packweb.views.save_form %}"
method="post" enctype="multipart/form-data">{%csrf_token%}
<table>
<tr><td name="date">上傳日期:{% now "Y-m-d" %}</td></tr>
<tr><td>檔案描述:<input type="text" name="content"></td></tr>
<tr><td>上傳檔案:<input type="file" name="file"></td></tr>
<tr><td> <input id="post" type="button" value="送出" /> </td></tr>
</table>
</form>
*enctype="multipart/form-data":檔案傳到server時編碼,寫只能用在method="post"
*{%csrf_token%}:Django的API避免使用者重複送出
*{% now "Y-m-d" %}:Django的templates tags
* 記得要取name 名稱,python才能抓到內容
結果畫面
Models(設計資料庫)
- 一個紀錄填寫的資訊
- 一個紀錄上傳檔案的詳細資訊
備註:
up欄位File因為變成 Foreign key 因此Django資料庫會自動參加 " _id " 在後面
up欄位File因為變成 Foreign key 因此Django資料庫會自動參加 " _id " 在後面
Views (檔案上傳程式)
@csrf_protect
def save_form(request):
def save_form(request):
try:
if request.method == 'POST':
# request.POST.get 如果沒有request到資料時會丟回None
date = request.POST.get('date')
content = request.POST.get('content')
# 存入資料庫
form = up_file(upload_datetime = date,
content = content)
form.save()
files = [f for key, f in request.FILES.items()] #抓取檔案(可能多個檔案)
if len(files) > 0:
try:
file_dir = os.path.join('自己設一個路徑' , str(form.pk))
#如果路徑中的檔案夾不存在就建立一個新的
if not os.path.exists(file_dir):
os.makedirs(file_dir)
for file in files:
#為了避免檔案名稱重複,因此存在server端時,把修改檔案名稱
local_name = datetime.now().strftime('%Y%m%d%H%M%S')
file_path = os.path.join(file_dir, local_name)
#存入資料庫
file_save = file_info(
file_id = form.pk,
local_name = local_name, #存在server檔名
upload_name = file.name #原本檔名
)
file_save.save()
#開始讀寫檔案至server
#'b' 如果檔案存在就會被覆蓋
destination =open(file_path,'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
except:
shutil.rmtree(file_dir, True) #發生例外,就刪除路徑檔案
HttpResponse('not ok')
except:
HttpResponse('not ok')
請問是不是有models.py檔要編輯後才能動呢
回覆刪除嗯嗯,models.py是資料庫欄位設計檔案
刪除所以我上面畫的models就是我資料庫欄位的概念圖