Python Web框架之Django框架文件上传功能详解


Posted in Python onAugust 16, 2019

本文实例讲述了Python Web框架之Django框架文件上传功能。分享给大家供大家参考,具体如下:

上传方式:

- Form表单上传文件
- Ajax上传文件
- 基于form表单和iframe自己实现ajax请求

1,创建项目

Python Web框架之Django框架文件上传功能详解

2,settings配置(注册app01,static路径等等这些)及url添加(略过)

3,views视图函数

form的视图收到了在request.FILES中的文件数据。从上述form来的数据可以通过request.FILES['file']来存取。

特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空。

from django.shortcuts import render,redirect,HttpResponse
from app01 import models
import json
import os
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')
    obj = request.FILES.get('fafafa')
    # print(obj.name,obj.size) #读取文件名称和大小,返回后台
    # print(user,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()
    models.Img.objects.create(path=file_path)
    ret={'status':True,'path':file_path}
    return HttpResponse(json.dumps(ret))

4,文件操作方法

obj.read():从文件中读取整个上传的数据,这个方法只适合小文件;

obj.chunks():按块返回文件,通过在for循环中进行迭代,可以将大文件按块写入到服务器中;

obj.multiple_chunks():这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为2.5M,可以调整)时,该方法返回True,否则返回False,因此可以根据该方法来选择选用read方法读取还是采用chunks方法

obj.name:这是一个属性,不是方法,该属性得到上传的文件名,包括后缀,如123.exe;

obj.size:这也是一个属性,该属性得到上传文件的大小。

5.1 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>
    {% for item in img_list %}
      <img style="height: 200px;width: 200px;" src="/{{ item.path }}" />
    {% endfor %}
  </div>
</body>
</html>

5.2 原生的ajax Http请求上传文件方法

涉及到两个对象FormData和XMLHttpRequest

利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.

XMLHttpRequest 是一个API, 它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。

XMLHttpRequest 是一个 JavaScript 对象,它最初由微软设计,随后被 Mozilla、Apple 和 Google采纳. 如今,该对象已经被 W3C组织标准化. 通过它,你可以很容易的取回一个URL上的资源数据. 尽管名字里有XML, 但 XMLHttpRequest 可以取回所有类型的数据资源,并不局限于XML。 而且除了HTTP ,它还支持file 和 ftp 协议.

语法var myRequest = new XMLHttpRequest();

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .container img{
      width:200px;
      height:200px;
    }
  </style>
</head>
<body>
  <div class="container">
    {% for img in img_list %}
      <img src="/{{ img.path }}">
    {% endfor %}
  </div>
  <input type="file" id="imgs" />
  <input type="button" value="提交" onclick="UploadXML()" />
  <script>
    function UploadXML() {
      var dic = new FormData();
      dic.append('user', 'v1');//append() 给当前FormData对象添加一个键/值对,name字段名称.value字段值.可以是,或者一个字符串,如果全都不是,则该值会被自动转换成字符串.
      dic.append('fafafa', document.getElementById('imgs').files[0]);
      console.log(dic);
      var xml = new XMLHttpRequest();
      xml.open('post', '/upload.html', true);
      xml.onreadystatechange = function () {
        if(xml.readyState == 4){
          var obj = JSON.parse(xml.responseText);
          if(obj.status){
            var img = document.createElement('img');
            img.src = "/" + obj.path;
            document.getElementById("imgs").appendChild(img);
          }
        }
      };
      xml.send(dic);//发送请求. 如果该请求是异步模式(默认),该方法会立刻返回. 相反,如果请求是同步模式,则直到请求的响应完全接受以后,该方法才会返回.
    }
  </script>
</body>
</html>

5.4 jQuery Ajax上传,同时使用了iframe,一下代码包含了两种方法。即:

  • 1-利用JQuery Ajax + FormData进行文件上传
  • 2-基于Iframe实现伪Ajax 上传文件
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .container img{
      width: 200px;
      height: 200px;
    }
  </style>
  <script>
    function li(arg) {
      console.log(arg);
    }
  </script>
</head>
<body>
  <h1>测试Iframe功能</h1>
  <input type="text" id="url" />
  <input type="button" value="点我" onclick="iframeChange();" />
  <iframe id="ifr" src=""></iframe>
  <hr/>
  <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" />
    <input type="file" name="fafafa" />
    <input type="submit" />
  </form>
  <h1>图片列表</h1>
  <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="提交XML" onclick="UploadXML()" />
  <input type="button" value="提交JQ" onclick="Uploadjq()" />
  <script src="/static/jquery-2.1.4.min.js"></script>
  <script>
    function UploadXML() {
      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);
          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');
      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){
            var img = document.createElement('img');
            img.src = "/" + arg.path;
            $('#imgs').append(img);
          }
        }
      })
    }
    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();
      var obj = JSON.parse(str_json);
      if (obj.status){
        var img = document.createElement('img');
        img.src = "/" + obj.path;
        $('#imgs').append(img);
      }
    }
  </script>
</body>
</html>

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
在Python中使用元类的教程
Apr 28 Python
Python编程中的for循环语句学习教程
Oct 14 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
python异常处理try except过程解析
Feb 03 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
Python虚拟环境venv用法详解
May 25 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 #Python
python创建与遍历List二维列表的方法
Aug 16 #Python
python每天定时运行某程序代码
Aug 16 #Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 #Python
Python Web框架之Django框架Form组件用法详解
Aug 16 #Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 #Python
python禁用键鼠与提权代码实例
Aug 16 #Python
You might like
用PHP发电子邮件
2006/10/09 PHP
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP执行速率优化技巧小结
2008/03/15 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
js使用心得分享
2015/01/13 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
查看python下OpenCV版本的方法
2018/08/03 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
python利用tkinter实现屏保
2019/07/30 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
优秀学生事迹材料
2014/02/08 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
自我鉴定总结
2014/03/24 职场文书
教师党员一句话承诺
2014/03/28 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
个人授权委托书样本
2014/09/13 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书