文件上传

form表单实现文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bs/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-offset-3 col-md-6">
            <form action="" style="margin-top:100px" class="form-group" method="post" enctype="multipart/form-data">
                {% csrf_token  %}
                <div class="form-group">
                    <label>用户名:</label>
                    <input type="text" name="user" class="form-control">
                </div>
                <div>
                    <label>上传文件</label>
                    <input type="file" name="file_obj">
                </div>
                <input type="submit" class="btn btn-info" value="提交">
            </form>
        </div>
    </div>
</div>

</body>
<script src="/static/jquery/jquery-3.3.1.js"></script>
</html>

django部分

def upload(request):
    if request.POST:
        file_obj = request.FILES.get("file_obj")
        print(file_obj)
        path = os.path.join(settings.MEDIA_ROOT, file_obj.name)
        
        with open(path, 'wb')as f:
            for line in file_obj:
                f.write(line)
    return render(request, "upload.html")

ajax实现文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <link rel="stylesheet" href="/static/bs/css/bootstrap.css">

    <style type="text/css">
        .error {
            color: #ff2b23;
        }
    </style>
</head>

<body>
<div class="container" style="margin-top: 100px">
    <div class="row">
        <div class="col-md-offset-3 col-md-6">
            <form id="form">
                {% csrf_token %}
                <div class="form-group">
                    <label>用户名:</label>
                    <input type="text" class="form-control" id="user" name="user">
                    <span class="error pull-right"></span>
                </div>
                <div class="form-group">
                    <label>密码:</label>
                    <input type="password" class="form-control" id="pwd" name="pwd">
                    <span class="error pull-right"></span>
                </div>
                <div class="form-group">
                    <label>确认密码:</label>
                    <input type="password" class="form-control" id="re_pwd" name="re_pwd">
                    <span class="error pull-right"></span>
                </div>
                <div class="form-group">
                    <label for="avatar">头像
                        <img id="avatar_img" src="/media/avatar/default.jpeg" height="60" width="60">
                    </label>
                    <input type="file" id="avatar" name="avatar" style="display: none;">
                </div>
                <input type="button" class="sub btn btn-info" value="注册">
            </form>
        </div>
    </div>
</div>
</body>
<script src="/static/jquery/jquery-3.3.1.js"></script>
<script type="text/javascript">
    $("#avatar").change(function () {
        var file_obj = $(this)[0].files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file_obj);
        console.log(reader.result);
        reader.onload = function () {
            $("#avatar_img").attr("src", reader.result);
        }

    });
    $(".sub").click(function () {
        var pwd = $("#pwd").val();
        var re_pwd = $("#re_pwd").val();

        if (pwd != re_pwd) {
            $("#re_pwd+ span").html("两次密码不一致");
            setTimeout(function () {
                $("#re_pwd").next().html('');
            }, 1000);
            return
        }


        var formdata = new FormData();
        var requestData = $("#form").serializeArray();
        $.each(requestData, function (index, data) {
            formdata.append(data.name, data.value)
        });
        console.log(formdata);
        $.ajax({
            url: "",
            type: "post",
            contentType: false,
            processData: false,
            data: formdata,
            success: function (data) {
                console.log(data);
                if (data.user) {
                    alert("注册成功!");
                    location.href = "/login/";
                } else {
                    $("span.error").html('');
                    $.each(data.msg, function (field, error_list) {
                        console.log(field);
                        console.log(error_list);
                        $("#" + field).next().html(error_list);
                    })
                }
            }

        })


    })
</script>
</html>
django部分

views.py

def reg(request):
    print(request.POST)
    if request.is_ajax():
        form = UserForm(request.POST)
        response = {"user": None, "msg": None}
        if form.is_valid():
            user = form.cleaned_data.get('user')
            pwd = form.cleaned_data.get('pwd')
            avartar_obj = request.FILES.get('avatar')
            extra = {}
            if avartar_obj:
                extra["avatar"] = avartar_obj
            models.UserInfo.objects.create_user(username=user, password=pwd, **extra)
            response["user"] = user
            
        else:
            print(form.errors)
            response["msg"] = form.errors
        return JsonResponse(response)
    return render(request, 'reg.html')
    
def login(request):
    if request.is_ajax():
        response = {"user": None, "msg": None}
        print(request.POST)
        username = request.POST.get("user")
        pwd = request.POST.get("pwd")
        user = auth.authenticate(username=username, password=pwd)
        
        if user:
            auth.login(request, user)
            response["user"] = user.username
        else:
            response["msg"] = "用户名或者密码不正确"
        return JsonResponse(response)
    
    return render(request, "login.html")

models

class UserInfo(AbstractUser):
    avatar = models.FileField("avatar/", default='avatar/default.jpeg')
原文地址:https://www.cnblogs.com/Jason-lin/p/9375187.html