Django实现任意文件上传(最简单的方法)


Posted in Python onJune 03, 2020

利用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>

Django实现任意文件上传(最简单的方法)

第二步:设置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,再运行浏览器,就可以看到结果。

Django实现任意文件上传(最简单的方法)

接下来,需要判断用户是不是真的上传了文件,如果用户仅仅只是点了 一下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()。

首先选择文件:

Django实现任意文件上传(最简单的方法)

点击upload,显示upload over!

查看指定目录下是否有相应的上传文件:

Django实现任意文件上传(最简单的方法)

到此这篇关于Django实现任意文件上传(最简单的方法)的文章就介绍到这了,更多相关Django 任意文件上传内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
python非递归全排列实现方法
Apr 10 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Python PO设计模式的具体使用
Aug 16 Python
python_mask_array的用法
Feb 18 Python
Python学习之os模块及用法
Jun 03 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
Python flask框架如何显示图像到web页面
Jun 03 #Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 #Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 #Python
利用python实现平稳时间序列的建模方式
Jun 03 #Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 #Python
基于Python快速处理PDF表格数据
Jun 03 #Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 #Python
You might like
PHP生成便于打印的网页
2006/10/09 PHP
php中几种常见安全设置详解
2010/04/06 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
Python中私有属性的定义方式
2020/03/05 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
python程序需要编译吗
2020/06/19 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
农药学硕士毕业生自荐信
2013/09/25 职场文书
产假请假条
2014/04/10 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
golang特有程序结构入门教程
2021/06/02 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python