js大文件分块上传与tornado接收文件和下载

将文件分块上传使用的是HTML5的功能(IE可能不支持)

<div class="layui-container">
    <input type="file" id="file" multiple required>
    <br>
    <div class="layui-progress layui-progress-big" lay-filter="demo">
        <div class="layui-progress-bar layui-bg-green"></div>
    </div>
    <br>
    <button class="layui-btn btnFile">立即提交</button>
    <script type="text/javascript">
        var element = layui.element;
        var time = new Date().getTime();
        var upload = function (file, num) {
            var formData = new FormData();
            var blockSize = 1024 * 1024 * 2;
            var blockNum = Math.ceil(file.size / blockSize);
            var nextSize = Math.min(num * blockSize, file.size);
            var fileData = file.slice((num - 1) * blockSize, nextSize);
            formData.append("file", fileData);
            formData.append("fileName", file.name);
            $.ajax({
                url: "",
                type: "POST",
                data: formData,
                processData: false,
                contentType: false,
                success: function (responseText) {
                    element.progress('demo', ((num * 100) / blockNum) + '%');
                    if (file.size <= nextSize) {
                        layer.msg("上传成功");
                        return;
                    }
                    upload(file, ++num);//递归调用
                }
            });
        };
        $(".btnFile").click(function () {
            var file = $("#file")[0].files[0];
            upload(file, 1);
        });
    </script>
</div>

tornado接收

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import tornado.ioloop
import tornado.web
import os

class UploadFileHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('''
        <html>
          <head><title>Upload File</title></head>
          <body>
            <form action='file' enctype="multipart/form-data" method='post'>
            <input type='file' name='file'/><br/>
            <input type='submit' value='submit'/>
            </form>
          </body>
        </html>
        ''')

    def post(self):
        #文件的暂存路径
        upload_path=os.path.join(os.path.dirname(__file__),'files')  
        #提取表单中‘name’为‘file’的文件元数据
        file_metas=self.request.files['file']    
        for meta in file_metas:
            filename=meta['filename']
            filepath=os.path.join(upload_path,filename)
            #有些文件需要已二进制的形式存储,实际中可以更改
            with open(filepath,'wb') as up:      
                up.write(meta['body'])
            self.write('finished!')

app=tornado.web.Application([
    (r'/file',UploadFileHandler),
])

if __name__ == '__main__':
    app.listen(3000)
    tornado.ioloop.IOLoop.instance().start()

在js中构建表单发起下载文件请求

tornado中响应如下:

def post(self,filename):
    print('i download file handler : ',filename)
    #Content-Type这里我写的时候是固定的了,也可以根据实际情况传值进来
    self.set_header ('Content-Type', 'application/octet-stream')
    dispositionName='attachment; filename='+filename
    #因为文件名可能有中文,会出现问题
    dispositionName.encode()
    self.set_header ('Content-Disposition', dispositionName)
    #读取的模式需要根据实际情况进行修改
    buff = 1024 * 1024 * 2
    with open(filename, 'rb') as f:
        while True:
            data = f.read(buff)
            if not data:
                break
            self.write(data)
    #记得有finish哦
    self.finish()

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Python中使用Tornado进行多线程分片上传文件的步骤如下: 1. 导入所需的模块: ```python import os import tornado.ioloop import tornado.web from concurrent.futures import ThreadPoolExecutor ``` 2. 创建一个自定义的RequestHandler类,并指定使用线程池处理请求: ```python class UploadHandler(tornado.web.RequestHandler): executor = ThreadPoolExecutor(max_workers=4) # 指定线程池的最大工作线程数 @tornado.web.asynchronous @tornado.gen.coroutine def post(self): # 获取上传文件 file = self.request.files['file'][0] filename = file['filename'] # 将文件分片保存到临时文件夹中 temp_path = os.path.join('temp', filename) with open(temp_path, 'wb') as f: f.write(file['body']) # 处理文件分片的上传逻辑,可以使用多线程或协程进行处理 self.finish("Upload complete") ``` 3. 创建一个Tornado应用,并将自定义的RequestHandler指定为路由处理器: ```python def make_app(): return tornado.web.Application([ (r"/upload", UploadHandler), ]) ``` 4. 在主函数中启动Tornado服务: ```python if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 这样,当客户端发送POST请求到`/upload`路径时,Tornado将会使用线程池来处理请求,将文件分片保存到临时文件夹中,并可以在`post`方法中实现自定义的文件分片上传逻辑。 请注意,上述代码只是一个简单的示例,实际应用中可能需要添加更多的错误处理、文件合并等逻辑。另外,为了保证线程安全性,可能需要对临时文件进行加锁操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值