zoukankan      html  css  js  c++  java
  • Django之上传文件

    Django之上传文件

      最简单的文件上传方式:

      后端代码:   

    def f1(request):
        if request.method == "GET":
            return render(request,"f1.html")
        else:
            import os
            print(request.FILES)  #这里是文件的数据   request.POST 是取文本的数据
            file_obj = request.FILES.get("fafafa")   #获取用户上传的文件
            print(file_obj.name)  #文件名
            print(file_obj.size)  #文件大小
            f = open(os.path.join("static",file_obj.name),"wb")
            for chunk in file_obj.chunks():
                f.write(chunk)
            f.close()
            return render(request,"f1.html")

      前端代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="post" action="/f1/" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="file" name="fafafa">
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

      基于Form验证的文件操作:

        后端操作:

    class F2Form(Form):
        user = fields.CharField()
        fafafa = fields.FileField()
    
    def f2(request):
        """
        文件上传
        :param request:
        :return:
        """
        if request.method == "GET":
            obj = F2Form()
            return render(request,"f2.html",{"obj":obj})
        else:
            obj = F2Form(data=request.POST,files=request.FILES)
            if obj.is_valid():
                print(obj.cleaned_data.get("fafafa").name) #拿文件名
                print(obj.cleaned_data.get("fafafa").size) #拿文件大小
            return render(request,"f2.html",{"obj":obj})

        前端代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="post" action="/f2/" enctype="multipart/form-data">
            {% csrf_token %}
            {{ obj.user }}
            {{ obj.fafafa }}
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

       Ajax 的上传文件:

        1.XMLHttpResponse方式:

        后端:

    import os
    def upload(request):
        if  request.method == "GET":
            return render(request,'upload.html')
        else:
            print(request.POST,request.FILES)
            file_obj = request.FILES.get('fafafa')
            file_path = os.path.join("static",file_obj.name)
            with open(file_path,'wb') as f:
                for chunk in file_obj.chunks():
                    f.write(chunk)
            return HttpResponse(file_path)

        前端:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>原生Ajax上传文件</h1>
        <input type="file" id="i1" />
        <a onclick="upload1();">上传</a>
        <div id="container1"></div> //存放路径
        
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            function upload1(){
                var formData = new FormData(); //FormData能传文件,能传字符串
                formData.append('k1','v1');
                formData.append('fafafa',document.getElementById('i1').files[0]);
    
                var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function(){
                    if(xhr.readyState == 4){
                        var  file_path = xhr.responseText;
                        var tag = document.createElement('img');
                        tag.src = "/"+ file_path;
                        document.getElementById('container1').appendChild(tag); //存放路径
                    }
                };
                xhr.open('POST','/upload/');
                xhr.send(formData);
            }
        </script>
    </body>
    </html>

        2.jQuery Ajax方式:

        前端:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>    
        <h1>jQuery Ajax上传文件</h1>
        <input type="file" id="i2" />
        <a onclick="upload2();">上传</a>
        <div id="container2"></div> //存放路径
    
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            function upload2(){
                var formData = new FormData();
                formData.append('k1','v1');
                // formData.append('fafafa',document.getElementById('i1').files[0]);
                formData.append('fafafa',$('#i2')[0].files[0]);
                // $('#i2') -> $('#i2')[0]
                // document.getElementById('i1') -> $(document.getElementById('i1'))
    
                $.ajax({
                    url: '/upload/',
                    type: 'POST',
                    data: formData,
                    contentType:false,
                    processData:false,
                    success:function(arg){
                        var tag = document.createElement('img');
                        tag.src = "/"+ arg;
                        $('#container2').append(tag);
                    }
                })
            }
        </script>
    </body>
    </html>

        3.伪Ajax方式:

        前端:伪Ajax上传解决了浏览器低版本问题,应用了iframe提交form表单不刷新页面的特点。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>伪 Ajax上传文件</h1>
        <form id="f1" method="POST" action="/upload/" target="ifr" enctype="multipart/form-data">
            <iframe id="ifr" name="ifr" style="display: none"></iframe>
            <input type="file" name="fafafa" />
            <a onclick="upload3();">上传</a>
        </form>
        <div id="container3"></div>
    
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            function upload3(){
                document.getElementById('ifr').onload = loadIframe;
                document.getElementById('f1').submit();
            }
    
            function loadIframe(){
                var content = document.getElementById('ifr').contentWindow.document.body.innerText;
                var tag = document.createElement('img');
                tag.src = "/"+ content;
                $('#container3').append(tag);
            }
        </script>
    </body>
    </html>

    ----- END ------

  • 相关阅读:
    【JVM源码解析】模板解释器解释执行Java字节码指令(下)
    【JVM源码解析】模板解释器解释执行Java字节码指令(上)
    【超硬核】JVM源码解读:Java方法main在虚拟机上解释执行
    Airtest结合tidevice实现IOS自动化测试
    Xcode连接真机提示设备未认证或版本太旧解决方案
    Jmeter——SMTP Sampler发送邮件
    Jmeter——脱离Jenkins后,Ant集成邮件通知
    spring boot快速入门
    MyBatisPlus 快速入门
    VS 查看引用的DLL/Nuget包源码时,无法看到注释
  • 原文地址:https://www.cnblogs.com/george92/p/11481530.html
Copyright © 2011-2022 走看看