python django web 端文件上传
利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现。
第一步:在模板文件中,创建一个form表单,需要特别注意的是,在有文件上传的form表单中,method属性必须为post,而且必须指定它的enctype为"multipart/form-data",表明不对字符进行编码,具体的代码如下:
<form enctype="multipart/form-data" action="/uploadFile/" method="post">
<input type="file" name="myfile" />
<br/>
<input type="submit" value="upload"/>
</form>

第二步:设置urls.py文件,指定相应的视图函数进行处理
第三步:最重要的,在视图函数中做处理,先把代码贴出来,一共就这么点,可以实现任何格式文件的上传
def upload_file(request):
if request.method == "POST": # 请求方法为POST时,进行处理
myFile =request.FILES.get("myfile", None) # 获取上传的文件,如果没有文件,则默认为None
if not myFile:
returnHttpResponse("no files for upload!")
destination = open(os.path.join("E:\\upload",myFile.name),'wb+') # 打开特定的文件进行二进制的写操作
for chunk in myFile.chunks(): # 分块写入文件
destination.write(chunk)
destination.close()
returnHttpResponse("upload over!")
代码就是上面这些。
这里需要对上面视图函数中的代码进行详细的解释一番:
首先,对于上传的文件,虽然是通过POST的方式上传的,但是不能通过request.POST["myfile"]或者request.POST.get("myfile", None),这两种方式来访问,这里需要使用另外一种方式,就是:
request.FILES["myfile"]或者request.FILES.get("myfile", None)
因为上传的文件是保存在FILES这个字典中的,可以在if request.method =="POST"之前加上一句assert False,再运行浏览器,就可以看到结果。
接下来,需要判断用户是不是真的上传了文件,如果用户仅仅只是点了 一下upload按键,那么就提示他没有上传文件。
下面是最重要的部分,现在已经得到了文件了,但是文件在内存中,没有写到硬盘里面去,接下里需要完成的就是把文件写入到硬盘,那到底该怎么写,我看了很多人的博客,写的云里雾里的,都没有说清楚,把我搞糊涂了。
其实上传文件,就是把硬盘里面某个文件的数据,写入到服务器指定的文件中,在最底层不管是txt文件还是exe文件等,全都是二进制的数据,这里所要做的只是将已经上传了的文件的数据,以二进制的方式写入到服务器指定的文件中,这个文件可以随意命名。
比如可以将上传的123.exe文件,保存为abc.txt,但是这毫无意义,对于上传的123.exe,在服务器上也应该是123.exe。其实在这里所说的abc.txt和123.exe的内容是完全一样的,只需要将abc.txt的文件后缀改为exe就行了。
在进行进一步的代码解释之前,需要先讲几个关于上传文件的方法和属性:
myFile.read():从文件中读取整个上传的数据,这个方法只适合小文件;
myFile.chunks():按块返回文件,通过在for循环中进行迭代,可以将大文件按块写入到服务器中;
myFile.multiple_chunks():这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为2.5M,可以调整)时,该方法返回True,否则返回False,因此可以根据该方法来选择选用read方法读取还是采用chunks方法:
if myFile.multiple_chunks() == False:
# 使用myFile.read()
else:
# 使用myFile.chunks()
myFile.name:这是一个属性,不是方法,该属性得到上传的文件名,包括后缀,如123.exe;
myFile.size:这也是一个属性,该属性得到上传文件的大小。
接下来的一行代码是:
destination = open(os.path.join("E:\\upload",myFile.name), 'wb+')
这一行代码需要用到os模块,import os。对于os.path.join("E:\\upload", myFile.name),如果上传的文件为123.exe,那么将得到E:\\upload\\123.exe这个路径,以写二进制的方式打开这个文件。接下来是分块写入数据:
for chunk in myFile.chunks(): # 分块写入文件
destination.write(chunk)
数据写完之后关闭文件就可以了,destination.close()。
python django web 端文件上传的更多相关文章
- web端文件上传,预览,下载,删除
//HTML部分 <div class="item attachment attachmentNew"> <span class="name&quo ...
- 七牛云存储的 Javascript Web 前端文件上传
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传 七牛是不错的云存储产品,特别是有免费的配额可 ...
- Web Uploader文件上传插件
http://www.jq22.com/jquery-info2665 插件描述:WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现 ...
- Web Uploader文件上传&&使用webupload有感(黄色部分)
引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...
- 第三百一十九节,Django框架,文件上传
第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- Django之Ajax文件上传
请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有3种: 1 application/x-www-form-urlencoded(看下图) 这应该是最常见的 P ...
- Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件
一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...
- django 快速实现文件上传
前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对 ...
随机推荐
- 爬虫day02
s10day112 内容回顾: 第一部分:爬虫相关 1. 谈谈你对http协议的理解? 规范: 1. Http请求收发数据的格式 GET /index/ http1.1/r/nhost:xxx.com ...
- restful知识点之六rest-framework组件流程图
- 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager
以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...
- Oracle使用ODBC连接配置
该配置是在windows 7 32位下进行的,程序已经通过了测试(使用VBS进行的测试) 1.文件下载 ------------------------------------------------ ...
- 读取本地IP地址和子网页码
#region 读取本地IP地址和子网页码 //读取本地IP地址和子网页码 NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterf ...
- Java学习---面向对象的远程方法调用[RMI]
基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...
- redis-day1
1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Memcached缓存服务软件很像, ...
- 【RabbitMQ】2、RabbitMQ入门程序——Hello World
首先说一下,MQ全称为Message Queue消息队列是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序 ...
- 粒子群优化算法PSO及matlab实现
算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...
- DQL、DML、DDL、DCL概念与区别
SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...