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 相关文章推荐
bpython 功能强大的Python shell
Feb 16 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
django缓存配置的几种方法详解
Jul 16 Python
python如何生成各种随机分布图
Aug 27 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
pandas的to_datetime时间转换使用及学习心得
Aug 11 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
NumPy中的维度Axis详解
Nov 26 Python
基于PyTorch中view的用法说明
Mar 03 Python
如何在C++中调用Python
May 21 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
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
js选择器全面解析
2016/06/27 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Python列表list排列组合操作示例
2018/12/18 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
python Tensor和Array对比分析
2020/01/08 Python
Python netmiko模块的使用
2020/02/14 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
工程技术员岗位职责
2015/04/11 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
文艺节目主持词
2015/07/06 职场文书