如何實現html上傳文件並被Django後臺處理

如何實現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的作用,如下圖:
關於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的博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章