首页 > Web开发 > 详细

上传文件 JSONP 输入框验证

时间:2019-09-22 12:03:03      阅读:64      评论:0      收藏:0      [点我收藏+]

一、上传文件

1.1、form上传

技术分享图片
---------------------url

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(upload.html/, views.upload),
]

-------------------upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post" action="/upload.html/" enctype="multipart/form-data">
        <input type="text" name="user">
        <input type="file" name="fafafa">
        <input type="submit" value="提交">
    </form>

    <div>
        {% for item in img_list %}
            <img style="height: 200px;width: 200px" src="/{{ item.path }}">
        {% endfor %}
    </div>

</body>
</html>

-------------------------views.py

def upload(request):
    if request.method == GET:
        img_list = models.Img.objects.all()
        return render(request,upload.html,{img_list:img_list})
    elif request.method == POST:
        user = request.POST.get(user)
        fafafa = request.POST.get(fafafa)   # 获取文件名称
        print(user,fafafa)
        obj = request.FILES.get(fafafa)    # 获取文件内容
        print(obj,obj.name,obj.size)   # 文件 ,文件名 , 文件大小
        # 传输文件
        file_path = os.path.join(static,upload,obj.name)
        f = open(file_path, wb)  # 上传文件路径  如果保存的数据库,保存的是路径
        for chunk in obj.chunks():
            f.write(chunk)
        f.close()
        print(user, fafafa)
        models.Img.objects.create(path=file_path)  # 存储文件的路径到数据库
        return render(request,upload.html)

--------------------models.py

class Img(models.Model):
    path = models.CharField(max_length=128)
form上传

1.2、AJAX上传(FormData)

技术分享图片
-------------------------url

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(upload.html/, views.upload),
    path(upload.html/upload.html/, views.upload),
]

-----------------------upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container img{
            height: 300px;
            width: 300px;
        }
    </style>
</head>
<body>
    <div class="container">
        {% for img in img_list %}
            <img src="/{{ img.path }}">
        {% endfor %}
    </div>

    <input type="file" id="img">
    <input type="button" value="提交" onclick="Upload()">

    <script>
        function Upload() {
            // 创建FormData(),接受文件数据
            var dic = new FormData();
            // dic.append(user,v1);
            dic.append(fafafa,document.getElementById(img).files[0]);
            // 发送文件数据
            var xml = new XMLHttpRequest();
            xml.open(post,upload.html/,true);
            xml.send(dic);
        }
    </script>
</body>
</html>

--------------------------views.py

from django.shortcuts import render,redirect,HttpResponse
import os
from app import models

def upload(request):
    if request.method == GET:
        img_list = models.Img.objects.all()
        return render(request,upload.html,{img_list:img_list})
    elif request.method == POST:
        obj = request.FILES.get(fafafa)    # 获取文件内容
        print(obj,obj.name,obj.size)   # 文件 ,文件名 , 文件大小
        # 传输文件
        file_path = os.path.join(static,upload,obj.name)
        f = open(file_path, wb)  # 上传文件路径  如果保存的数据库,保存的是路径
        for chunk in obj.chunks():
            f.write(chunk)
        f.close()
        models.Img.objects.create(path=file_path)  # 存储文件的路径到数据库
        return render(request,upload.html)

----------------------models.py

from django.db import models

class Img(models.Model):
    path = models.CharField(max_length=128)
方法1
技术分享图片
--------------------------url

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(upload.html/, views.upload),
    path(upload.html/upload.html/, views.upload),
]

-------------------------views.py

from django.shortcuts import render,redirect,HttpResponse
import os
from app import models
import json

def upload(request):
    if request.method == GET:
        img_list = models.Img.objects.all()
        return render(request,upload.html,{img_list:img_list})
    elif request.method == POST:
        obj = request.FILES.get(fafafa)    # 获取文件内容
        print(obj,obj.name,obj.size)   # 文件 ,文件名 , 文件大小
        # 传输文件
        file_path = os.path.join(static,upload,obj.name)
        f = open(file_path, wb)  # 上传文件路径  如果保存的数据库,保存的是路径
        for chunk in obj.chunks():
            f.write(chunk)
        f.close()
        models.Img.objects.create(path=file_path)  # 存储文件的路径到数据库
        ret = {status:True,path:file_path}
        return HttpResponse(json.dumps(ret))  # python字符串装换成JSON字符串  返回ret

-------------------------------upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container img{
            height: 300px;
            width: 300px;
        }
    </style>
</head>
<body>
    <div class="container" id="imgs">
        {% for img in img_list %}
            <img src="/{{ img.path }}">
        {% endfor %}
    </div>

    <input type="file" id="img">
    <input type="button" value="提交" onclick="Upload()">

    <script>
        function Upload() {
            // 创建FormData(),接受文件数据
            var dic = new FormData();
            // dic.append(user,v1);
            dic.append(fafafa,document.getElementById(img).files[0]);
            // 发送文件数据
            var xml = new XMLHttpRequest();
            xml.open(post,upload.html/,true);
            xml.onreadystatechange = function(){
              if (xml.readyState == 4){
                  var obj = JSON.parse(xml.responseText);   // parse转换成JSON对象  获取返回的ret
                  if (obj.status){     // 返回 ret中的status = True
                      var img = document.createElement(img);
                      img.src = / + obj.path;
                      document.getElementById(imgs).appendChild(img);
                  }
              }
            };
            xml.send(dic);
        }
    </script>
</body>
</html>

------------------------models.py

from django.db import models

class Img(models.Model):
    path = models.CharField(max_length=128)
方法1上传图片自动显示
技术分享图片
--------------------------url

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(upload.html/, views.upload),
    path(upload.html/upload.html/, views.upload),
]

-------------------------views.py

from django.shortcuts import render,redirect,HttpResponse
import os
from app import models
import json

def upload(request):
    if request.method == GET:
        img_list = models.Img.objects.all()
        return render(request,upload.html,{img_list:img_list})
    elif request.method == POST:
        obj = request.FILES.get(fafafa)    # 获取文件内容
        print(obj,obj.name,obj.size)   # 文件 ,文件名 , 文件大小
        # 传输文件
        file_path = os.path.join(static,upload,obj.name)
        f = open(file_path, wb)  # 上传文件路径  如果保存的数据库,保存的是路径
        for chunk in obj.chunks():
            f.write(chunk)
        f.close()
        models.Img.objects.create(path=file_path)  # 存储文件的路径到数据库
        ret = {status:True,path:file_path}
        return HttpResponse(json.dumps(ret))  # python字符串装换成JSON字符串  返回ret

-------------------------------upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container img{
            height: 300px;
            width: 300px;
        }
    </style>
</head>
<body>
    <div class="container" id="imgs">
        {% for img in img_list %}
            <img src="/{{ img.path }}">
        {% endfor %}
    </div>

    <input type="file" id="img">
    <input type="button" value="提交" onclick="Upload()">
    <input type="button" value="提交AJAX" onclick="Uploadjq()">
    <script>
        function Upload() {
            // 创建FormData(),接受文件数据
            var dic = new FormData();
            // dic.append(user,v1);
            dic.append(fafafa,document.getElementById(img).files[0]);
            // 发送文件数据
            var xml = new XMLHttpRequest();
            xml.open(post,upload.html/,true);
            xml.onreadystatechange = function(){
              if (xml.readyState == 4){
                  var obj = JSON.parse(xml.responseText);   // parse转换成JSON对象  获取返回的ret
                  if (obj.status){     // 返回 ret中的status = True
                      var img = document.createElement(img);
                      img.src = / + obj.path;
                      document.getElementById(imgs).appendChild(img);
                  }
              }
            };
            xml.send(dic);
        }
        
        
        function Uploadjq() {
            // 创建FormData(),接受文件数据
            var dic = new FormData();
            dic.append(fafafa,document.getElementById(img).files[0]);
            
            $ajax({
                url:upload.html/,
                type:POST,
                data:dic,
                processData:false,   // dic图片数据不做处理,传输文件
                contentType:false,
                dataType:JSON,
                success:function (arg) {
                    // console.log(arg)
                    if (arg.status){
                        var img = document.createElement(img);
                        img.src = / + arg.path;
                        $(#imgs).append(img);

                    }

                }
                
            })
            
        }
    </script>
</body>
</html>

------------------------models.py

from django.db import models

class Img(models.Model):
    path = models.CharField(max_length=128)
方法2

1.3、iframe和form共同完成异步上传(iframe 功能:接受内容,并执行)

技术分享图片
--------------------------url

from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(upload.html/, views.upload),
    path(upload.html/upload.html/, views.upload),
]

------------------------views.py

from django.shortcuts import render,redirect,HttpResponse
import os
from app import models
import json

def upload(request):
    if request.method == GET:
        img_list = models.Img.objects.all()
        return render(request,upload.html,{img_list:img_list})
    elif request.method == POST:
        obj = request.FILES.get(fafafa)    # 获取文件内容
        print(obj,obj.name,obj.size)   # 文件 ,文件名 , 文件大小
        # 传输文件
        file_path = os.path.join(static,upload,obj.name)
        f = open(file_path, wb)  # 上传文件路径  如果保存的数据库,保存的是路径
        for chunk in obj.chunks():
            f.write(chunk)
        f.close()
        models.Img.objects.create(path=file_path)  # 存储文件的路径到数据库
        ret = {status:True,path:file_path}
        return HttpResponse(json.dumps(ret))  # python字符串装换成JSON字符串  返回ret

-----------------------------models.py

from django.db import models

class Img(models.Model):
    path = models.CharField(max_length=128)

----------------------------upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .container img{
            height: 300px;
            width: 300px;
        }
    </style>
</head>
<body>
    <div class="container" id="imgs">
        {% for img in img_list %}
            <img src="/{{ img.path }}">
        {% endfor %}
    </div>
    <h2> 测试iframe功能</h2>
    <input type="text" id="url">
    <input type="button" value="点我" onclick="iframeChange()">
    <iframe id="ifr" src=""></iframe>
    
    <h2>基于iframe实现提交</h2>
    <form action="/upload.html/" method="post" target="iframe_1" enctype="multipart/form-data">
        <iframe id="iframe_1" name="iframe_1" src="" onload="loadiframe()" style="display: none" ></iframe>
        <input type="text" name="user">
        <input type="file" name="fafafa">
        <input type="submit" value="实现iframe">
    </form>


    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
    function iframeChange() {
            var url = $(#url).val();
                $(#ifr).attr(src,url);
        }

        function loadiframe() {
            console.log(1);
            // 获取iframe的内容
            var str_json = $(#iframe_1).contents().find(body).text();   // contents 获取上下文(包含html页面时)
            obj = JSON.parse(str_json);
            if (obj.status) {
                var img = document.createElement(img);
                img.src = / + obj.path;
                $(#imgs).append(img);
            }
        }

    </script>

</body>
</html>
form和iframe实现上传

二、JSON

JSON:实质就是通过一个触发事件->创建一个标签,该标签包含一个方法->当事件触发事件,就会执行已经存在的方法

技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" onclick="jsonpRequest()" value="跨域请求">

    <script>
        // 1.创建一个方法,方法创建一个标签,标签内含有一个方法。当执行该方法时,标签内的方法就会自动执行
        function jsonpRequest() {
            tag = document.createElement(script);
           // tag.src = http://www.baidu.com;
            pFun(执行pFun方法);   // 标签内包含的方法,调用jsonRequest()时,就会调用执行
            document.head.appendChild(tag);
            document.head.removeChild(tag)
        }
        // 被执行的方法
        function pFun(arg) {
            console.log(arg)
        }

    </script>
</body>
</html>
JSON实现

三、Django的form验证

Form表单的功能

  • 自动生成HTML表单元素
  • 检查表单数据的合法性
  • 如果验证错误,重新显示表单(数据不会重置)
  • 数据类型转换(字符类型的数据转换成相应的Python类型)

Form相关的对象包括

  • Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签
  • Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
  • Form:一系列Field对象的集合,负责验证和显示HTML元素
  • Form Media:用来渲染表单的CSS和JavaScript资源。

Form 表单实现验证的步骤

     步骤一: 用户提交数据的验证
             1、创建模版 class LoginForm(forms.Form):...
             2、将请求交给模版,创建一个对象 obj = LoginForm(request.POST)
             3、进行验证 obj.is_valid()
             4、获取正确信息 obj.clean()
             5、获取错误信息 obj.errors
     步骤二: 错误信息提示
             Form提交,刷新页面的特性,模版对象内部值丰富,再显示时,值和错误信息都有
     步骤三:保留上一次提交的数据
             1、自动生成html标签
             2、保留上一次提交的数据

实例:

---------------------url

    path(login.html/, views.login),
    path(index.html/, views.index),

--------------------views

from django.shortcuts import render,redirect,HttpResponse

"""def login(request):
    if request.method == ‘GET‘:
        return render(request,‘login.html‘)
    elif request.method == ‘POST‘:
        u = request.POST.get(‘uname‘)
        e = request.POST.get(‘emil‘)
        p = request.POST.get(‘pwd‘)
        print(u,e,p)
        return render(request,‘login.html‘)"""

from django import forms
class LoginForm(forms.Form):
    user = forms.CharField(max_length=14,min_length=6,error_messages={"required": 用户名不能为空,min_length: 用户名长度不能小6})
    email = forms.EmailField(error_messages={"required": 邮箱不能为空,invalid: 邮箱格式错误})

class Indexfrom(forms.Form):
    user = forms.CharField(max_length=14, min_length=6,error_messages={"required": 用户名不能为空,min_length: 用户名长度不能小6})
    email = forms.EmailField(error_messages={"required": 邮箱不能为空,invalid: 邮箱格式错误})
    favor = forms.MultipleChoiceField(
        choices=[(1,小虎),(2,小小虎),(3,小B虎)]
         )
def login(request):
    if request.method == "GET":
        # 数据库中获取
        obj = LoginForm()
        return render(request, login.html, {oo: obj})
    elif request.method == "POST":
        ‘‘‘obj = LoginForm(request.POST)
        state = obj.is_valid()  # 状态(布尔类型 True  False)
        print(state)
        value_dict = obj.clean()  # 成功信息
        print(value_dict)
        error_obj = obj.errors()  # 失败信息
        print(error_obj)
        ‘‘‘
        obj = LoginForm(request.POST)
        if obj.is_valid():
            value_dict = obj.clean()
            print(value_dict)
        # create(**value_dict)  #成功数据添加到表中
        else:
            pass
        return render(request, login.html, {oo: obj})
def index(request):
# obj = Indexfrom
obj = Indexfrom({‘user‘: ‘root‘,‘email‘: ‘root@live.com‘,‘favor‘: [2,3]}) # 设置默认值
return render(request,‘index.html‘,{‘obj‘:obj})

--------------------login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Form提交数据</h1> <form method="POST" action="/login.html/"> <p> {{ oo.user }} <span>{{ oo.errors.user.0 }}</span> </p> <p> {{ oo.email }} <span>{{ oo.errors.email.0 }}</span> </p> <p> {{ oo.favor }} </p> <p> <input type="text" name="pwd" placeholder="密码" /> </p> <input type="submit" value="提交" /> {{ msg }} <input id="ajax_submit" type="button" value="Ajax提交" /> </form> </body>

 

上传文件 JSONP 输入框验证

原文:https://www.cnblogs.com/070727sun/p/11551578.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!