从python下载文件到angularjs

时间:2014-11-26 05:55:56

标签: python angularjs web-services flask

我有这个代码,我希望用户和客户端可以下载该文件。

这是我的服务:

 DownLoad: function (data) {
        return $http({
          url: urlBase + 'export_file/',
          headers: {'Content-Type': undefined},
          data: data,
          method: 'POST'
        });
      }
    };

上面的代码将作为python和angularjs的连接器

这是我的python代码,我希望结果传递给我的angularjs:

@api.route("/export_file/", methods=["POST"])
 def export_file():
  if request.method == 'POST':

    home = expanduser("~")
    home2 = os.path.join(home,"try.txt")
    ap = csv.writer(file(home2,'wb'))
    ap.writerows(["HELLOW WORLD"])
    db.session.commit()

    return jsonify({'success': True})

这是我的angularjs,它作为数据的接收者:

$scope.DLFILE = function() {
                        downloading.DownLoad()
                        .success(function(data, status, headers, config) {console.log(data);
                        if (data.success) {
                            $scope.ExportDate={}
                            var blob = new Blob([data], {type: "text/plain;charset=utf-8"}); #I add this one which came from other source, and I hope this may help to save my data.
                            saveAs(blob, "hello world.txt");
                            console.log('success!');

                        }
                        })
                        .error(function(data, status, headers, config) {

                            console.log('error in downloading!');

                        });

                // }
            };

现在,当我运行它时,我的python中的数据总是保存到服务器用户的主目录中。我还希望客户端中的用户下载它,但可以保存到他们想要的下载文件夹中。有人能帮我吗?我仍然对如何传递数据感到困惑。谢谢。

1 个答案:

答案 0 :(得分:0)

我不会对angularjs部分发表评论。您的问题在于烧瓶如何处理您的请求。

给出如下所示的烧瓶结构。

├── flasksandbox.py
├── static
│   └── downloadThis.txt
└── templates
    └── empty.html

并且您希望允许用户下载名为downloadThis.txt的文件

您的烧瓶路线将是:

from flask import Flask, render_template, send_file

app = Flask(__name__)


@app.route('/')
def get_file():
    return send_file('static/downloadThis.txt',as_attachment=True)

if __name__ == '__main__':
    app.run()

如果您需要流式传输文件(例如,如果您的文件非常庞大或想要动态生成)请查看http://flask.pocoo.org/docs/0.10/patterns/streaming/,您可以执行以下操作:

@app.route('/stream')
def get_file_stream():
    def generate():
        for letters in "this is suppose to be a big csv file iterator or something":
            yield letters + '\n'


    return Response(generate(),
                    mimetype="text/plain",
                    headers={"Content-Disposition":
                               "attachment;filename=test.txt"})

最后,标题{ "Content-Disposition" :"attachment"filename=text.txt"}将告诉浏览器处理响应,将文件作为附件下载而不是在浏览器上显示,而filename = text.txt将是默认文件名

send_file()中,通过提供参数as_attachment=True,此标题信息会自动添加到您的响应中