• 文件上传三种方式


     

    需求

    上传图片在页面显示

    Form表单上传

    <!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>
          {% if img %}
              <img style="height: 200px; 200px;" src="/{{ img }}" />
          {% endif %}
      </div>
      <script src="/static/jquery-2.1.4.min.js"></script>
      
    </body>
    </html>

    //后台代码
    from django.shortcuts import render
    import os
    def upload(request):
      if request.method == 'GET':
          return render(request,'upload.html')
      elif request.method == "POST":
          user = request.POST.get('user')
          fafafa = request.POST.get('fafafa')
          obj = request.FILES.get('fafafa')

          file_path = os.path.join('static','upload',obj.name)
          f = open(file_path, 'wb')
          for chunk in obj.chunks():
              f.write(chunk)
          f.close()
          ret = {'status': True, 'path': file_path}
          return render(request,"upload.html",{'img':file_path})

    缺点:上传后整个页面会刷新,不好

    Ajax上传

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <style>
          .container img{
               200px;
              height: 200px;
          }
      </style>
    </head>
    <body>
      <input ID="v1" name="user" placeholder="用户">
      <input type="file" name="fafafa" id="img" />
      <input type="button" value="提交XML" onclick="UploadXML()" />
      <input type="button" value="提交JQ" onclick="Uploadjq()" />
      <div id="imgs">

      </div>
    </body>
      <script src="/static/jquery-2.1.4.min.js"></script>
      <script>
          function UploadXML() {
              var dic = new FormData();
              dic.append('user', $('#v1').val());
              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);
                      console.log(obj)
                      if(obj.status){
                          var img = document.createElement('img');
                          img.src = "/" + obj.path;
                          document.getElementById("imgs").appendChild(img);
                      }
                  }
              };
              xml.send(dic);
          }
          function Uploadjq() {
              var dic = new FormData();
              dic.append('user', $('#v1').val());
              dic.append('fafafa', document.getElementById('img').files[0]);

              $.ajax({
                  url: '/upload.html',
                  type: 'POST',
                  data: dic,
                  processData: false,  // tell jQuery not to process the data
                  contentType: false,  // tell jQuery not to set contentType
                  dataType: 'JSON',
                  success: function (arg) {
                      if (arg.status){
                          console.log("111")
                          var img = document.createElement('img');
                          img.src = "/" + arg.path;
                          $('#imgs').append(img);
                      }
                  }
              })

          }
      </script>

    </body>
    </html>

    /////后台代码
    from app01 import models
    import json

    from django.shortcuts import render,HttpResponse
    import os,json
    def upload(request):
      if request.method == 'GET':
          return render(request,'upload.html')
      elif request.method == "POST":
          user = request.POST.get('user')
          print(user)
          fafafa = request.POST.get('fafafa')
          obj = request.FILES.get('fafafa')

          file_path = os.path.join('static','upload',obj.name)
          f = open(file_path, 'wb')
          for chunk in obj.chunks():
              f.write(chunk)
          f.close()
          ret = {'status': True, 'path': file_path}
          return HttpResponse(json.dumps(ret))

    实现了异步刷新,但是部分老版本的浏览器不支持FormData对象

    基于iframe实现form提交

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <style>
          .container img{
               200px;
              height: 200px;
          }
      </style>
    </head>
    <body>
      <h1>基于iframe实现form提交</h1>
      <form action="/upload.html" method="post" target="iframe_1" enctype="multipart/form-data">
          <iframe style="display: none"  id="iframe_1" name="iframe_1" src="" onload="loadIframe();"></iframe>
          <input type="text" name="user" /><br>
          <input type="file" name="fafafa" />
          <input type="submit" value="提交" />
      </form>
      <div id="imgs">

      </div>
    </body>
      <script src="/static/jquery-2.1.4.min.js"></script>
      <script>
          function loadIframe() {
              console.log(1);
              // 获取iframe内部的内容
              var str_json = $('#iframe_1').contents().find('body').text();
              var obj = JSON.parse(str_json);
              if (obj.status){
                  var img = document.createElement('img');
                  img.src = "/" + obj.path;
                  $('#imgs').append(img);
              }
          }
      </script>

    </body>
    </html>
    ///后台代码
    from django.shortcuts import render,HttpResponse
    import os,json
    def upload(request):
      if request.method == 'GET':
          return render(request,'upload.html')
      elif request.method == "POST":
          user = request.POST.get('user')
          print(user)
          fafafa = request.POST.get('fafafa')
          obj = request.FILES.get('fafafa')

          file_path = os.path.join('static','upload',obj.name)
          f = open(file_path, 'wb')
          for chunk in obj.chunks():
              f.write(chunk)
          f.close()

          ret = {'status': True, 'path': file_path}

          return HttpResponse(json.dumps(ret))

    效果

  • 相关阅读:
    UVa 10905
    有道云笔记同步IT笔试面试资源
    送给80、90后的人生经典语录,别再孩子气了
    ch1 位姿表示和旋转矩阵
    jetson nano使用RealSenseD400深度相机
    jetson nano电源(性能)管理
    http://emanual.robotis.com/docs/en/platform/turtlebot3/overview/
    Jetson Nano配置与使用——中文输入法ibus配置
    jetson nano更改源
    ROS多机通信
  • 原文地址:https://www.cnblogs.com/jiadp/p/9328096.html
Copyright © 2020-2023  润新知