主要内容:

一、文件长传的三种方式

二、简单预览功能实现

一、form表单上传

1.页面代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'upload' %} " method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="img">
<input type="submit">
</form>
</body>
</html>

2.后端view函数处理

def upload(request):
if request.method=="GET":
return render(request,'upload.html')
elif request.method=="POST":
res={"status":"success","code":999}
img_obj=request.FILES.get('img')#获取文件对象
with open(os.path.join('static',img_obj.name),"wb") as f:
for chunk in img_obj.chunks(chunk_size=1024):
f.write(chunk)
return HttpResponse(json.dumps(res))
二、利用Jquery中ajax+FormData实现上传文件

FormData使用方式:

  • 创建一个空的FormData对象,然后再用append方法逐个增加键值对

  var formdata = new FormData();
  formdata.append("name","xx");
  formdata.append("flie", filename);

  • 取得form元素对象,将它作为参数传入FormData对象中。

  var formOjb = document.getElementById("form");
  var formdata = new FormData(formOjb );

  • 利用form元素对象的getFormData方法生成它

  var formobj = document.getElementById("form");
  var formdata = formobj.fetFormData();

1.页面代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="{% url 'upload' %} " method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="img">
</form>
<span style="padding: 5px;color: royalblue" onclick="Jqajax();">jq上传</span>
<script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/static/jquery.cookie.js"></script>
<script> function Jqajax() {
var file_obj=$('input[name="img"]')[0].files[0];//获取dom形式的文件对象
var form_obj=new FormData(); //创建formdata对象
form_obj.append('img',file_obj); //将文件对象加载formdata中
$.ajaxSetup({ //设置csrf_token
beforeSend: function (xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", $.cookie("csrftoken"));
}
});
$.ajax({
type: 'POST',
url: '{% url 'upload' %}',
data: form_obj,//指明发送的文件对象
processData: false, // 告诉jquery要传输data对象
contentType: false, // 告诉jquery不需要增加请求头对于contentType的设置
success: function (data) {
console.log(data)
}
})
}
</script>
</body>
</html>

后端处理逻辑不变

三、基于iframe实现伪ajax文件上传

原理:iframe数据提交不刷新页面

好处:通过iframe的src属性进行上传功能,这样的好处不用依赖FormData对象,低版本浏览器可能不支持该对象。

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'upload' %}" method="post" target="iframe_1" enctype="multipart/form-data">
{% csrf_token %}
<iframe style="display: none" id="iframe_1" name="iframe_1" src=""></iframe>
<input type="file" name="img" />
<input type="submit" onclick="iframeSubmmit();" value="iframe上传"/>
</form>
<script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/static/jquery.cookie.js"></script>
<script>
function iframeSubmmit() {
$('#iframe_1').load(function () {//用户获取上传成功以后的返回值
var text=$('#iframe_1').contents().find('body').text();
var obj=JSON.parse(text);
console.log(obj) ;
})
}
</script>
</body>
</html>

后端处理逻辑一样

四、图片预览功能

原理:通过图片上传时候服务端返回文件路径,然后使用js设置a标签src属性实现预览功能

后端代码:

def upload(request):
if request.method=="GET":
return render(request,'upload.html')
elif request.method=="POST":
img_obj=request.FILES.get('img')#获取文件对象
file_path=os.path.join('static',img_obj.name)
res={"status":"success","code":999,"file_path":file_path}
with open(os.path.join(file_path,"wb") as f:
for chunk in img_obj.chunks(chunk_size=1024):
f.write(chunk)
return HttpResponse(json.dumps(res))

Django文件上传三种方式以及简单预览功能的更多相关文章

  1. 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)

    flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/det ...

  2. python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,

    python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...

  3. django文件上传、图片验证码、抽屉数据库设计

    1.Django文件上传之Form方式 settings.py, ALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  4. 文件上传三:base64编码上传

    介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,现在不推荐用了. 优点: 1.浏览器可以马上展示图像,不需要先上 ...

  5. Ajax文件上传三式

    文件上传(三式) 1.urls.py文件 url(r'^upload.html$', views.upload), 2.views.py文件 import os def upload(request) ...

  6. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  7. 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0

    实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...

  8. Python菜鸟之路:Django 文件上传的几种方式

    方式一:通过form表单中,html input 标签的“file”完成 # 前端代码uoload.html <form method="post" action=" ...

  9. Django文件上传(经典上传方式)

    经典文件上传方式 创建URL from django.contrib import admin from django.urls import path from django.conf.urls i ...

随机推荐

  1. golang 轮训加密算法

    Roy's friends has been spying on his text messages, so Roy thought of an algorithm to encrypt text m ...

  2. Effective Java 第三版——17. 最小化可变性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. 七行代码开始flask

    前言: 对于现有的企业接口服务实现方式来说,Java比较适用于大型的并发式的业务场景:而对一些低IO的且功能简单的数据接口来说,Python似乎更合适.近几年流行的Flask可以说是专为接口式开发而生 ...

  4. HTML5 使用FileReader实现调用相册、拍照功能

    HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ...

  5. vue2.0 样式表引入的方法 css sass less

    在引入样式之前,首先要了解static.assets两个文件夹的区别. 从字面上可以看出,static用来存放静态文件,assets用来存放资源文件: static存放的文件不会被编译,打包后直接赋值 ...

  6. Linux(Cent OS7.2)下启动停止memcached方法及ps命令使用讲解

    Linux下,以Cent OS7.2为例,安装memcached后的启动方法很简单,这里我们使用yum源安装. 首先查找yum源版本库的memchaced安装包, yum list | grep me ...

  7. Spring_Spring与AOP

    一.传统编程使用代理解决目标类增强问题 //主业务接口 public interface ISomeService { // 目标方法 void doFirst(); // 目标方法 void doS ...

  8. 深入理解ES6之—数据解构

    一 对象解构 对象解构语法在赋值语句的左侧使用了对象字面量 let node = { type: true, name: false } //既声明又赋值 let { type, name } = n ...

  9. es7 await/async解决异步问题

    最近做项目遇到一个问题,前端调用ie浏览器中的ocx的方法去查询数据,查询完之后ocx给一个返回值,然后js将返回值当参数传入到另外的函数中去做数据处理,但是遇到一个问题是前端需要异步去执行这个过程 ...

  10. [转载]binlog归档

    1.1. 前言 对数据库数据进行备份都是日常的工作(虽然都是自动做的),备份中有一项必备的那就是binglog了.在工作中一般这些备份都会保留一段时间后归档.时间长了归档的数据将会非常大.这时候我们就 ...