精华内容
下载资源
问答
  • Tornado上传和下载文件(以CSV文件为例) https://xercis.blog.csdn.net/article/details/108361817
  • python tornado 下载和上传文件

    千次阅读 2018-09-25 17:56:56
    class UploadHandler(tornado.web.RequestHandler): "Handle file uploads." def initialize(self, upload_path, naming_strategy): """Initialize with given upload path and naming strategy. :keyword ...
    测试上传的代码(@后边是路径):
    curl -F "key=value" -F "filename=@/tmp/static/t.png" http://localhost:8888/upload
    
    

    如果使用了-F参数,curl会以multipart/form-data的方式发送POST请求。-F以key=value的形式指定要上传的参数,如果是文件,则需要使用key=@file的形式。

    如果使用-d命令,curl会以application/x-www-url-encoded格式上传参数。

    curl -d "action=del" -d "id=12" http://localhost/test
    •  

    如果要以json格式上传参数,需要使用-H在命令中指定。

    curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost/api/login

     

    # 这里是代码
    
    def uuid_naming_strategy(original_name):
        "File naming strategy that ignores original name and returns an UUID"
        return str(uuid.uuid4())
    
    
    class UploadHandler(tornado.web.RequestHandler):
        "Handle file uploads."
    
        def initialize(self, upload_path, naming_strategy):
            """Initialize with given upload path and naming strategy.
    
            :keyword upload_path: The upload path.
            :type upload_path: str
            :keyword naming_strategy: File naming strategy.
            :type naming_strategy: (str) -> str function
    
            """
            self.upload_path = upload_path
            if naming_strategy is None:
                naming_strategy = uuid_naming_strategy
            self.naming_strategy = naming_strategy
    
        def post(self):
            fileinfo = self.request.files['filename'][0]
            filename = fileinfo['filename'] #self.naming_strategy(fileinfo['filename'])
            try:
                with open(os.path.join(self.upload_path, filename), 'w') as fh:
                    fh.write(fileinfo['body'])
                logging.info("%s uploaded %s, saved as %s",
                             str(self.request.remote_ip),
                             str(fileinfo['filename']),
                             filename)
            except IOError as e:
                logging.error("Failed to write file due to IOError %s", str(e))

     

    后边的参数可以设置basepath 是什么,网上的回答,大部分没有这一步。
    
    application = tornado.web.Application([
        (r'/ws', WSHandler),
        (r'/static/(.*)', DownloadHandler, dict(basepath="/tmp/static/") ),
        (r"/upload", UploadHandler,
         dict(upload_path="/tmp", naming_strategy=None)),
    ])
    class DownloadHandler(tornado.web.RequestHandler):
        def initialize(self, basepath):
            self.database = basepath
    
        def get(self,filename):
            self.set_header('Content-Type', 'application/octet-stream')
            self.set_header('Content-Disposition', 'attachment; filename=%s' % filename)
    
            path = os.path.join(self.basepath,filename)
            with open( path, 'rb') as f:
                while True:
                    data = f.read(4096)
                    if not data:
                        break
                    self.write(data)
    
            self.finish()
    展开全文
  • class MainHandler(tornado.web.RequestHandler): def get(self): filename = self.get_argument('filename') print(filename) # print(type(filename)) filenamee = filename+"export.csv" # print(filenames...

    1.flask

    from flask import Flask
    
    from flask import send_file
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return 'Hello World'
    
    # @app.route('/getPlotCSV', methods = ['GET'])
    # def plotCSV():
    #     data = open("./tudii.csv")
    
    
    @app.route('/getPlotCSV') # this is a job for GET, not POST
    def plot_csv():
        
        return send_file('./tudii.csv',
                         mimetype='text/csv',
                         attachment_filename='Adjacency.csv',
                         as_attachment=True)

    2.Tornado

    import tornado.ioloop
    import tornado.web
    
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            filename = self.get_argument('filename')
            print(filename)
            # print(type(filename))
            filenamee = filename+"export.csv"
            # print(filenames)
            # http头 浏览器自动识别为文件下载
            self.set_header('Content-Type', 'application/octet-stream')
            # 下载时显示的文件名称
            self.set_header('Content-Disposition', 'attachment; filename=%s' % filenamee)
            with open("./channel_compare_tabledemo/all_csv/"+filenamee, 'rb') as f:
                while True:
                    data = f.read(4096)
                    if not data:
                        break
                    self.write(data)
            # # 记得有finish哦
            self.finish()
    
    
    def make_app():
        return tornado.web.Application([
            (r"/", MainHandler),
        ])
    
    
    if __name__ == "__main__":
        app = make_app()
        app.listen(8888)
        tornado.ioloop.IOLoop.current().start()

     

    展开全文
  • Django下载大文件接口代码我是基于django的rest接口插件提供的下载文件接口,除了需要安装django之外还需要安装djangorestframework库不多说,下面直接贴代码#views.pyfrom rest_framework.permissions import Allow...

    Django下载大文件接口

    代码

    我是基于django的rest接口插件提供的下载文件接口,除了需要安装django之外还需要安装djangorestframework库

    不多说,下面直接贴代码

    #views.py
    
    from rest_framework.permissions import AllowAny
    from rest_framework.views import APIView
    from django.http import StreamingHttpResponse
    
    class DonwloadView(APIView):
        permission_classes = (AllowAny,)
    
        def get(self, request, format=None):
    
            def file_iterator(fn, chunk_size=512):
                while True:
                    c = fn.read(chunk_size)
                    if c:
                        yield c
                    else:
                        break
    
            fn = open('test.zip', 'rb')
            response = StreamingHttpResponse(file_iterator(fn))
            response['Content-Type'] = 'application/octet-stream'
            response['Content-Disposition'] = 'attachment;filename="test.zip"'
    
            return response
    
    # urls.py
    from django.conf.urls import url
    from rest_framework.urlpatterns import format_suffix_patterns
    
    from . import views
    
    urlpatterns = [
        url(r'^download/$', views.DonwloadView.as_view(), name='download'),
    ]
    
    urlpatterns = format_suffix_patterns(urlpatterns)
    

    这样子,一个基于django的大文件下载接口就提供完成,我这边是另一个系统使用的是tornado框架,所以下面是使用tornado框架自带的一些库来下载文件。

    注意事项

    这里使用的是django的StreamingHttpResponse,所以读文件的时候一定要使用’rb’,否则对于一些二进制文件可能会有问题(我这里没有测试)

    Tronado下载大文件

    代码

    使用tornado的库下载大文件时遇到很多问题,我先将代码贴出来,然后根据代码再将我遇到的问题贴出来分享一下,大家使用时别再走入误区,也知道问题原因。

    
    from tornado import httputil, httpclient
    
    fn = open("test.zip", 'ab')
    
    def _streaming_callback(data):
        fn.write(data)
    
    http_client = httpclient.HTTPClient(max_body_size=107374182400)
    
    request = httpclient.HTTPRequest(download_url,
                streaming_callback=_streaming_callback,
                connect_timeout=172800.0,  
                request_timeout=172800.0
    )
    
    http_client.fetch(request)

    注意事项

    1. 先从http_client.fetch开始吧,刚开始没有使用httpclient.HTTPRequest,直接使用的是django提供下载接口地址url[http://localhost/download],这个时候小文件是可以正常下载的,但是对于大的文件是会抛出599异常的(刚开时response=http_client.fetch(url),直接fn.write(response.body)),后来经过查找官网说是需要使用HTTPRequest来处理的。
    2. 上条提到使用HTTPRequest,并且发现HTTPRequest的参数streaming_callback,这是一个可调用函数,每次请求中接收到的数据块都会丢给这个函数,并且使用此参数之后,response.body和response.buffer最终都将会是None。然后开始在命令行敲代码进行测试,惊喜的发现,下载大文件时能够输出了文件内容了(刚开始在streaming_callback中,只是print(data),并且一两秒接着就停止了),以为问题已解决,遂部署到代码中实际应用,又出现问题,这次抛出的599 time out
    3. 接着上条继续,time out 那肯定就是超时了,然后继续查找HTTPRequest的参数,发现两个超时的参数connect_timeout和request_timeout,默认是20秒,修改成2天也就是172800.0(这里我没有去测试到底是哪个超时的,所以都给配置成大一些。),然后部署代码继续测试,但是可怕的问题继续出现,这次不超时的,但是又出现了第一次的 599 Connect Closed,这次是真的头大了,最后在一个同时的提示下,是否由上传大小的限制,经过不懈努力,终于在httpclient.HTTPClient中发现了最大限制
    4. 上条提到的最大限制由两个max_buffer_size/max_body_size,max_buffer_size是指一次读入内存中的最大字节,默认是100M,max_body_size默认是max_buffer_size的大小,是客户端可接收的响应body的大小。不使用streaming_callback时,取两者中最小的值。如果使用streaming_callback的话,那就是max_body_size生效,所以最终的解决方案就是我在HTTPClient对象中增加了参数max_body_size=107374182400,最大值为10G,至此这个问题是真正的解决了。
    展开全文
  • tornado-5.1

    2018-09-01 15:08:25
    python3.5下的tornado,可以学习一下网站的开发。希望有人喜欢。
  • PowerBI-visuals-龙卷风 垂直列出类别值的条形图。 用于比较两个不同组之间变量的相对重要性。 概述 龙卷风图是条形图的一种特殊类型,其数据类别是垂直列出的,而不是标准的水平表示形式,并且这些类别是按顺序...
  • tornado 安装包

    2013-02-01 11:46:38
    里面有tornado安装包,是一个不会堵塞的web服务器。
  • tornado中文

    2015-05-28 10:36:22
    tornado教程,纯正的中文版教程,适合初学者入门使用
  • 基于tornado服务器的文件上传和下载

    万次阅读 2018-12-27 16:27:44
    文章目录文件上传的服务端技术解析基于Ajax技术实现的文件上传客户端方法1:使用 ajaxfileupload.js方法2:仅依赖 jquery.js文件下载的服务端技术解析 文件上传的服务端技术解析 常言到,爱有多深、恨有多切。...

    文件上传的服务端技术解析

    常言到,爱有多深、恨有多切。tornado服务器就是这样一个矛盾体,它的缺点和它的优点一样,显著且强烈。有人认为,文件上传是tornado的重大缺陷之一,它把用户上传的文件存放在内存中——这意味着多用户同时上传文件的话,内存的开销会急剧增加。不过我倒是觉得,这反倒让很多事情变得简单了,比如,你想对用户上传的内容做处理的话,不用再打开文件了,因为内容就在内存中。再者说,在tornado的异步机制下,我不确定真的能够多用户同时上传文件。这是一个有趣的问题。

    好了,言归正传吧。假定文件上传的表单如下:

    <form id="form_upload" action="/demo/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="want_to_upload_file_1"/><br/>
        <input type="file" name="want_to_upload_file_2"/><br/>
        <input type="submit" value="上传"/>
    </form>
    

    机制是允许一次上传多个文件的。这里有几个问题需要特别说明一下。

    • 在提交表单之前,需要为form指定action和method的属性值,如果是上传文件,还要设置enctype=“multipart/form-data”。这三个属性,可以写在html中,也可以在submit之前用js的方法为其赋值

    • 文件浏览是file类型的input标签自备的功能,程序员无法在浏览器框架内操作本地文件。该标签的name属性,是用来区别于其他文件的标识,不是文件名,也不是文件对象,更不是文件内容

    上面的表单被提交到/demo/upload(假定上传的第1个文件名为dqd.jpg,第2个文件名为intro.png),这个请求的对象中包含files字典,上传的全部文件的信息都包含在这个结构中。我们来看看这个request.files的真实面貌:

    def post(self):
        print self.request.files.keys() # [u'want_to_upload_file_1', u'want_to_upload_file_2']
        print type(self.request.files['want_to_upload_file_1']) # list,长度为1
        meta_file_1 = self.request.files['want_to_upload_file_1'][0]
        print meta_file_1.keys() # ['body', 'content_type', 'filename']
        print len(meta_file_1['body']) # 31492,文件长度
        print meta_file_1['content_type'] # image/jpeg
        print meta_file_1['filename'] # dqd.jpg
    

    有了这些素材,我们就可以无所不能地应对客户需求了。比如,不做任何处理,仅仅用原文件名保存在指定路径下(假设保存在/static/image/wiki目录下):

    PROJECT_PATH = os.path.split(os.path.realpath(__file__))[0]
    upload_path = os.path.join(PROJECT_PATH, 'static', 'image', 'wiki')
    file_name = os.path.join(upload_path, meta_file_1['filename'])
    
    with open(file_name, 'wb') as fp:
        fp.write(meta_file_1['body'])
    

    很多时候,需要对用户上传的文件重命名(比如,用时间戳为文件名),但文件后缀名不变。

    fn, ext = os.path.splitext(meta_file_1['filename'])
    fn = '%d%s' % (time.time()*1000, ext)
    file_name = os.path.join(upload_path, fn)
    

    如果需要对用户上传的文件类型做检查,请使用文件的content_type,而不是文件的扩展名,因为前者更规范。比如,JPEG类型的图片文件,其后缀名可能是.jpg|.jpeg|.JPG|.JPEG中的一种,而前者只有“image/jpeg”一种表示法。

    关于文件的content_type,网上资料多如牛毛,请自行搜索。

    处理用户上传的图片文件时,除了限制文件大小,有时候还要做缩放处理,甚至一并生成缩略图,此时就需要将文件内容转成易于处理的图像对象,比如,pil的Image

    from PIL import Image
    import StringIO
    
    pilImg = Image.open(StringIO.StringIO(meta_file_1['body']))
    print pilImg.size
    

    至于如何缩放、如何保存为文件,请自行检索相关资料。

    基于Ajax技术实现的文件上传客户端

    假定上传文件的表单是这样的:

    <form id="form_upload" action="/demo/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="wiki_img" id="wiki_img" /><br />
        <input id="doUpload" type="button" value="上传" />
    </form>
    

    方法1:使用 ajaxfileupload.js

    <script src="jquery.js"></script>
    <script src="ajaxfileupload.js"></script>
    <script type="text/javascript">
        $("#doUpload").click(function(){
            $.ajaxFileUpload({
                url:'/demo/upload',
                secureuri:false,
                fileElementId:'wiki_img',
                dataType: 'json',
                success: function(data){
                    alert(data);
                }
            });
        });
    </script>
    

    方法2:仅依赖 jquery.js

    <script src="jquery.js"></script>
    <script type="text/javascript">
        var formData = new FormData();
        formData.append("file", $("#wiki_img")[0].files[0]);
        formData.append("filename", $("#wiki_img").val());
        
        $.ajax({
            url : '/demo/upload',
            type : 'POST',
            async : false,
            data : formData,
            processData : false,
            contentType : false,
            beforeSend:function(){
                $("#upload_tips").html("正在进行,请稍候");
            },
            success : function(data) {
                alert(data);
            }
        });
    </script>
    

    文件下载的服务端技术解析

    相对于上传,文件的下载就简单得多。只需要记住两点:开始前告诉浏览器要传输的文件类型,结束前对浏览器说拜拜。文件类型并不是固定的,需要根据文件的实际情况来选择。详情请自行检索。

    def get(self):
        self.set_header ('Content-Type', 'application/octet-stream')
        with open(filename, 'rb') as f:
            while True:
                data = f.read(buf_size)
                if not data:
                    break
                self.write(data)
        self.finish()
    

    配合seek命令,可以实现更复杂的下载请求,比如,断点续传、分块下载、ajax异步请求等。

    展开全文
  • tornado新版

    2014-08-19 07:43:21
    tornado新版, 狂暴的心, 异步非阻塞框架
  • tornado中文文档

    2011-08-03 10:21:02
    python的tornado的中文框架,对tornado的框架和模板进行了相应的说明
  • 文章目录 问题描述 解决方案 表单 AJAX方法 参考文献 问题描述 Tornado上传和下载文件,以读取和返回CSV文件为例。 前端上传文件给后端能解析,后端传回文件给前端能下载,且命名为中文不乱码。 input.csv 姓名,年龄...
  • 0k') 二、文件的下载 通常传来sign 解密后得到文件路径、文件名、有效期时间 也可同步生成文件,然后再返回出去 文件分片读取,分片下载(大小文件均适合) class DownLoadFileHandler(BaseHandler): def get(self): ...
  • 这是从git项目中提取出来的中文PDF版,方便大家使用。字体适应,排版较好。版权原作者所有,用于学习。
  • tornado-同步异步下载图片 同步下载,阻塞 from tornado.httpclient import HTTPClient url = 'http://fafafiajwoachwe.jpeg' client = HTTPClient() result = client.fetch(url) ...
  • tornado安装4.5.2

    2018-09-13 16:43:15
    Windows下安装tornado所需安装包,下载后进入黑屏终端,输入python setup.py install 即可
  • Tornado + React 的演示 此应用程序使用 Tornado Web 框架和 Duktape 嵌入式 Javascript 引擎演示了 React 组件的服务器端渲染。 去做 使用依赖于 Cython 的 duktape 版本 让 manifest.json 工作 勾搭客户端做一些...
  • Python和tornado下载、安装及配置

    千次阅读 2015-06-26 23:03:27
    Python和tornado下载、安装及配置 cmd .py
  • tornado实战之一

    2019-04-12 17:04:12
    tornado实战之一,对tornado有个初步的认识和一些基本的操作。
  • tornado实现文件下载

    千次阅读 2015-07-31 14:03:00
    class SpockDataIntegrationDownloadHandler(tornado.web.RequestHandler): def post(self): selectname = self.get_argument('selectname') json_string = {} """ 将请求参数放到dict中 """ type = self....
  • 本章节介绍Tornado通过获取表单数据,保存文件和参数,简单的说就是实现文件上传功能。
  • tornado python web框架

    2018-03-30 21:44:39
    全面细致的讲解了 tornado 的用法,能够基于此文档的介绍进行二次开发
  • tornado-2.2.1.tar.gz

    2018-03-22 13:55:16
    老版的tornado在网上资源已经不好找了,但是交叉编译或者其他工作中,经常要求需要老版的tornado,所以在这里把我有的tornado-2.2.1分享给大家。
  • tornado 导出数据为excel

    2020-04-14 18:48:38
    # 界面用 window.url() 直接打开该请求url,即会下载 self.set_header('Content-Type', 'application/x-xls') self.set_header('Content-Disposition', 'attachment; filename={}.xls'.format(time.strftime('%Y%m%d...
  • Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。 得利于其非阻塞的方式和对epoll的运用,Tornado 每秒...
  • tornado4.5.2安装

    2020-04-28 16:51:25
    Windows下安装tornado所需安装包,下载后进入黑屏终端进入对应文件夹,输入python setup.py install 即可
  • Tornado项目实战

    2019-04-09 16:02:36
    Tornado项目实战,参考教程http://demo.pythoner.com/itt2zh/ch4.html
  • 2019独角兽企业重金招聘Python工程师标准>>> ...下载过程综合了python和tornado对yield的应用。     转载于:https://my.oschina.net/u/111188/blog/677987
  • Tornado框架基础

    2021-03-23 14:36:56
    Tornado是FriendFeed使用的可扩展的非阻塞式web服务器及其相关工具的开源版本。这个Web框架看起来有些像web.py或者Google的webapp,不过为了能有效利用非阻塞式服务器环境,这个Web框架还包含了一些相关的有用工具和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,191
精华内容 3,276
关键字:

tornado下载