Bottle + WebUploader 修改Bottle框架从而大文件上传实现方案
Bottle 是个轻量级的Web框架,小巧又强大,真不愧是个轻量级的框架。可扩展性非常好,可以扩展很多功能,但是有些功能就不得不自己动手修改了。
Bottle:http://www.bottlepy.org/docs/dev/tutorial.html
BaiduWebUpLoader 则是一个我认为非常不错的大文件上传库,兼容IE6,Flash和HTML5两套自动选择方案。详情请阅读他们的项目文档。
BaiduWebUpLoader:https://github.com/fex-team/webuploader
BaiduWebUpLoader 可以将大文件拆成 N 个小POST请求分段传输,传输过程中有这些值:
我们将关键用到 chunk 值。当然了我建议你如果没读过webloader 的文档还是去读读。里面有详细的介绍,在这里不在阐述。
所以我们需要将 Bottle 框架修改成,每次的POST大文件分段的时候自动合并成一个文件,但是也不能影响单/多小文件上传。
现在我们来动手吧,对Bottle进行小小的修改。
首先阅读Bottle 官方文档可以看到很简单的文件上传,相信这对于你而言并不难。
文件最后保存的时候是用 upload.save() 函数来进行保存的,记住这个函数,我们要去修改它的源代码。
我们使用 request.files.gupet('upload_file') 既可以得到一个 FormsDict 对象,FormsDict对象是一群 对象的集合, 因为你一次上传并不可能只有一个文件,所以是有个集合的。
如同:
我们跟进 FileUpload 类,去看看他的定义。
这张图只需明白。self.file 值是外界赋值的,这里我们不管。
再看下张图,你会发现一个可喜之处。save函数就在这里,我们只需要进行更改就好了。
这里是 save 函数的实现。注释也说了各个参数的用法。
参数: 目的地 是否覆盖 缓冲区大小
接下来我们就需要更改这个 raise IOError('File exists.') ,因为只有这样,我们才可以对已有的文件进行追加写入,让多个POST请求变成一个文件。
保证下次文件存储的时候是可以合并在一起的,而不是覆盖。
但是发现并没有 POST数据,不能直接在这里写 with open(path,'ab') as fp,我们得看看它是如何实现的;
于是我们看看下面的 _copy_file 方法
看见这个函数,瞬间高兴了,这不 IO 流都在这里了嘛。这个函数将会每次从 POST 请求中读一段文件数据到缓冲区,然后再写到目标流。
看起来这个我是可以直接利用的,只需要加一个 追加,不重写就可以,因为这里的write 是open 返回的文件指针,是通用的。
于是我们修改成如下:
我们创建一个 ab 模式的文件指针。然后利用现有的 _copy_file 函数就好了!
注意我加了个参数,section_upload,当为True时代表追加写入文件模式。
这样我们就实现了几次文件POST包都可以合并(追加)成一个文件了。
但是还不止这样就结束了,还记得最开始的POST里面的 chunk 值吗?当它等于0的时候,就是代表一个新的文件,所以我们这样就可以避免重复追加。
如果不加这个判断,就会造成,以后上传只要文件名一样,就会追加到现有的文件,所以我们不能这样。
有些地方是业务逻辑,你看着变量名理解就好了。
overwrite 是是否覆盖,section_upload是我自定义的参数,表示追加模式。两者不可同时为True
这样,就可以实现 结合webloader就可以实现大文件上传,而又也不用担心小文件会出错。
不过你再使用之后,会发现一个奇异现象,就是任何上传中文名字的文件,中文名都会过滤掉。
原先我以为是编码问题,后来再去翻翻源码发现Bottle内部上传文件名自己进行了过滤,所以如果你不需要这个功能的话,还得去掉。
如果你不需要这个功能,你还得自己去掉这些代码。无视我那个注释。
不过你就要自己提供文件名过滤了,对了,POST请求中 你也可以用name的值。。
上传测试:
我们上传这些文件,我相信足够证明大文件可靠性。
这是我的 uploader 配置:
这里更正一下,最大并发数可以不为1,修改后的依然支持多并发,因为我们加了 chunk 的判断。从而兼容。
但是我还是建议为1,因为会出现一些意想不到的事情,在真实的网络中。
上传结果:
全部上传成功,并且没有一个文件损坏。
不过我忘记加小文件和其他格式文件了,我后来都测试过,全部正常。
单(多)小文件 Webloader 不会分段,而是直接POST,这个我们修改之后的也可以支持。
这样小小的修改一下Bottle框架之后,我们就可以实现大文件上传了,当然了是用的内置的HTTP服务。
如果搭配Apache的话就另外说了,不过我看了下代码应该也需要这样改。
可能的风险:
没有在真实网络测试,以后有机会加上。目前还没有试过,webloader 文档介绍会自动重传丢失部分;
但是我不能保证如果是POST传输文件数据的时候到一半断掉,或者漏了几个字节,然后原先已经写入数据却不能反悔了。
将会导致即使重传上传后追加的文件损坏。
这只是一点经验之谈,如果有任何更改方法或发现我的错误,欢迎指正,必当感谢。
Bottle + WebUploader 修改Bottle框架从而大文件上传实现方案的更多相关文章
- 使用webuploader实现大文件上传分片上传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- js实现大文件上传分片上传断点续传
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- vue大文件上传组件选哪个好?
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- web实现大文件上传分片上传断点续传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- JS大文件上传断点续传解决方案
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...
- JS大文件上传解决方案
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...
- tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)
tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...
- 使用百度webuploader实现大文件上传
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- web大文件上传(web应用---SSH框架)
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
随机推荐
- Java利用反射取得类的所有信息
Java中可以利用反射获取类的名称.构造函数.属性.方法.也就是说可以通过反射可以取得类的所有信息(不管该成员是否封装为private). 如有下面的Dept类定义: package org.lyk. ...
- MyEclipse中快速跳转到指定行号位置
有时候我们希望能从当前编辑位置跳到指定行号的位置,可以使用Ctrl + l 快捷键. 其中 l 代表line.
- xmpp实现的即时通讯聊天(二)
参考网址:http://www.jianshu.com/p/8894a5a71b70 借图描述原理: 三.注册.登陆.聊天功能的实现 故事板如下: 四个类如下: 不喜多言,直接上Demo: Login ...
- FUzhou 1607 Greedy division---因子个数问题。
Problem 1607 Greedy division http://acm.fzu.edu.cn/problem.php?pid=1607 Accept: 402 Submit: 1463T ...
- 精尽 Kafka 学习指南【优秀学习指南汇总】
1. 视频 炼石成金 <中间件之 Kafka> 一共有 19P .概念部分讲的蛮细的. 尚硅谷 <大数据视频_Kafka视频教程> 一共 24P .讲的还不错的. 书生小四 & ...
- maven jstl、jsp、servlet依赖
jstl.jsp.servlet依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId> ...
- 8 tensorflow修改tensor张量矩阵的某一列
1.tensorflow的数据流图限制了它的tensor是只读属性,因此对于一个Tensor(张量)形式的矩阵,想修改特定位置的元素,比较困难. 2.我要做的是将所有的操作定义为符号形式的操作.也就是 ...
- 登录MySQL提示ERROR 1045 (28000)错误解决方法
今天,登录服务器准备修改数据库的一些东西.但输入密码,却进不了数据库并提示一个错误,如下图 再确认密码没错的情况下,还是进不了数据库.便在网上找到了解决方法,记录下来,供参考学习. 解决方法: 总体思 ...
- shell_processing
1.文本处理_2:grep,sed,awk 2.regular_expression 3.Test 一.文本处理_2 1.grep --Linux处理正则表达式的主要程序.正则表达式是一种符号表示 ...
- npm、webpack、Gulp 中文教程
按顺序阅读 1.npm 模块管理器 2.package.json 文件 3.npm 模块安装机制简介 4.npm scripts 使用指南 5.CommonJS 规范 随着 es6 模块化特性的出现, ...