2013年8月29日 星期四

Python-上傳檔案



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 " 在後面




Views (檔案上傳程式)

@csrf_protect
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')










2 則留言:

  1. 請問是不是有models.py檔要編輯後才能動呢

    回覆刪除
    回覆
    1. 嗯嗯,models.py是資料庫欄位設計檔案
      所以我上面畫的models就是我資料庫欄位的概念圖

      刪除