2014-11-26 2 views
0

У меня есть этот код, который я хочу, чтобы этот пользователь и клиент могли загрузить файл.Загрузить файл с python в angularjs

Это моя служба:

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

код выше будет служить в качестве моего разъема для обоих питона и angularjs

И это мой питон код, который я хочу, чтобы результат передать своим 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 всегда сохраняются в домашнем каталоге пользователя сервера. Я хочу, чтобы пользователь в клиенте загрузил его, но может сохранить в желаемую папку для загрузки. Кто-нибудь может мне помочь? Я все еще смущен тем, как передавать данные. Спасибо.

ответ

0

Я не буду комментировать угловую часть. Ваша проблема заключается в том, как фляжка обрабатывает ваш запрос.

Учитывая структуру фляжки, как показано ниже.

├── 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"} покажет браузер обработки ответа, чтобы загрузить файл в качестве вложения вместо отображения в браузере и имя файла = text.txt будет умолчанию имя файла

В send_file(), предоставляя аргумент as_attachment=True, эта информация заголовка автоматически добавляется к вашему ответу колбой

Смежные вопросы