如何實現html上傳文件並被Django後臺處理
1.html前端代碼編寫:
先看代碼,代碼如下:
<form action="/order_upload/" method="post" enctype="multipart/form-data">
<ul class="forminfo">
<div class="">
<li><label>選擇文件</label>
<input type="file" id="info_file" name="info_file" class="dfinput" style="display:none;" onchange="change();" />
<input type="text" id="info_file_tmp" name="info_file_tmp" class="dfinput" readonly="readonly" onclick="info_file.click();">
<button name="" type="button" class="btn" onclick="info_file.click();" >瀏覽</button>
<i>文件必須是Excel文件</i>
<li><input type="submit" class="btn" value="確認保存" style="float:left; margin-right:15px;"/></li>
</li>
</div>
</ul>
{% csrf_token %}
</form>
注意,這裏的核心代碼是Form標籤和input type=file 標籤,Form標籤一定要添加enctype="multipart/form-data"這一屬性!!!!因爲這裏涉及到enctype的作用,如下圖:
所以,正如圖中所說,在使用包含文件上傳控件的表單時,必須使用multipart/form-data,而不是默認的application/x-www-form-urlencoded!!!
(因爲這點,花了我一晚上的時間,搞不出來,就是因爲這點!!基礎知識很重要!)
2.Django端後臺代碼編寫:
同樣,先看代碼:(注意,是要寫在View.py文件裏)
def orderupload(request):
#實現訂單上傳
if request.method == "POST":
obj = request.FILES.get('info_file')
baseDir = os.path.dirname(os.path.abspath(__name__))
orderDir = os.path.join(baseDir, 'userfile', 'orderfile')
filename = os.path.join(orderDir, obj.name)
fobj = open(filename, 'wb')
for chrunk in obj.chunks():
fobj.write(chrunk)
fobj.close()
return render(request, 'form.html')
這裏的代碼,思路是當提交method爲“POST”的時(這個是由前端html中Form屬性決定),通過request.FILES.get方法來獲取文件對象,這裏的’info_file’就是前端input type=‘file’ 標籤裏的name屬性所對應的值。然後,baseDir,orderDIr,filename是爲了在後端的userfile文件夾下的orderfile文件夾裏,將網頁前端得到的數據,寫到該文件裏,通過open(filename,wb)來創建一個文件輸出流,通過for循環語句,寫入文件。
以上就是通過html上傳文件並被Django後臺處理的方法,因爲一個enctype屬性值沒寫,搞了我一晚上,到處查資料,結果原因竟然是它,也是醉了。說明基礎知識還是要掌握紮實纔行!!
我的個人博客
歡迎大家訪問我搭建的個人博客哦,通過github Page搭建的,基於hexo,用了next主題。有什麼問題都可以互相交流。博客地址:我的個人博客:CodeSausage的博客