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根据路径导入模块的方法
Sep 30 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python之时间和日期使用小结
Feb 14 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Python列表如何更新值
May 27 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
Python OpenCV实现图像模板匹配详解
Apr 07 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支持页面回退的两种方法
2008/01/10 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
python动态监控日志内容的示例
2014/02/16 Python
详解Python的循环结构知识点
2019/05/20 Python
Python hashlib模块加密过程解析
2019/11/05 Python
老教师工作总结的自我评价
2013/09/27 职场文书
建筑行业的大学生自我评价
2013/12/08 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
python语言中pandas字符串分割str.split()函数
2022/08/05 Python