1. 程式人生 > >Django - 實現簡單的檔案上傳功能

Django - 實現簡單的檔案上傳功能

前端

<form action="" method="post" enctype="multipart/form-data">
{#<form action="" method="post" enctype="application/x-www-form-urlencoded">#}

    <input type="file" name="myfile">
    <input type="submit" value="提交">
</form>

'''
必須進行配置,且前二者解決編碼問題,即可解決中文傳輸亂碼問題
enctype="multipart/form-data" :不對字元編碼。在使用包含檔案上傳控制元件的表單時,必須使用該值。
enctype="application/x-www-form-urlencoded" : 在傳送前編碼所有字元(預設)

enctype="text/plain" : 空格轉換為 "+" 加號,但不對特殊字元編碼。

'''

檢視函式

from django.shortcuts import render, HttpResponse
import os,time

def fileupload(request):
    if request.method == 'GET':
        return render(request, 'fileupload.html')

    if request.method == 'POST':

        # FILES
        print(request.FILES)
        # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 1.png (image/png)>]}>
        print(type(request.FILES.get('myfile')))
        # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        # from django.core.files.uploadedfile import InMemoryUploadedFile

        # 從字典里根據名字,把檔案取出來
        myfile = request.FILES.get('myfile')
        print(myfile)
        print(type(myfile))
        # 1.png
        # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        
        # 檔名字
        name = myfile.name
        print(name)
        print(type(name))
        # 1.png
        # <class 'str'>

        # 若存在相同檔案,通過時間戳改名再上傳
        if os.path.exists(name):
            # return HttpResponse('false')
            now = time.strftime('_%Y%m%d%H%M%S')
            name = name.replace('.',now+'.')
            print(name)

        # 開啟檔案,把上傳過來的檔案通過檔案處理,迴圈存到本地
        with open(name, 'wb') as f:
            # for line in myfile.chunks(): 等同於 for line in myfile:
            for line in myfile:
                f.write(line)

        # 儲存成功 返回前端資料
        return HttpResponse('ok')