Ajax POST в колбу для загрузки бинарного файла (используется cytoscape) - PullRequest
0 голосов
/ 26 апреля 2018

Я использую cytoscape.js для создания меню, где я могу быстро загружать файлы. Я использую Ajax POST, чтобы передать имя файла в флешку для загрузки. По какой-то причине я могу получить всю информацию обратно, но по какой-то причине не могу загрузить файл. До сих пор я пробовал два метода.

AJAX Post:

{{
                    content: 'Download',
                    select: function(ele) {{
                        //this is to get the name of URI
                        var loc = window.location.pathname
                        var postData = {{
                             "element": ele.id(),
                             "source": loc
                         }}
                        $.ajax({{
                            url: '/get_file',
                            type: "POST",
                            contentType: 'application/json',
                            data: JSON.stringify(postData),
                            dataType: 'json',
                            success: function(response) {{
                                console.log("got it!")
                            }},
                            error: function(xhr) {{
                                console.log("Nope!")
                            }}
                        }})

Теперь для внутренней части колбы у нас есть метод один, и в закомментированном разделе показаны методы 2 и 3 (в цикле if (if os.path.isfile (SAVE_PATH)):

@app.route('/get_file', methods=['POST'])
def get_file():
    print("This is request data: {}".format(request.data))
    requests = request.get_json()
    element = requests['element']
    source = requests['source']
    #this is where loc is retrieved from ajax post, in format of /static/{filename}.html
    for change in ['/static/', '.html']:
        if change in source:
            source = source.replace(change,"")
    print("source: {}".format(source))
    SAVE_PATH = os.path.curdir + "/results/" + source + "/" + element
    SAVE_DIRECTORY = os.path.curdir + "/results/" + source + "/"
    if os.path.isfile(SAVE_PATH):
        downloaded_file = open("{}".format(SAVE_PATH), 'rb').read()
        #res = send_from_directory(SAVE_PATH.replace("./", ""), element, attachment_filename=element, mimetype="application/octet-stream", as_attachment=True)
        #res = send_file(SAVE_PATH, as_attachment=True, attachment_filename=element, mimetype='application/octet-stream')
        #return res
        return Response(
            downloaded_file,
            mimetype="application/octet-stream",
            headers={"Content-disposition":
                     "attachment; filename={}".format(element)})
    else:
        print("failed")
    return "failed"

Теперь я получаю все правильные ответы, когда я распечатываю загруженный_файл, я получаю двоичный вывод, но по какой-то причине он просто не загружается.

1 Ответ

0 голосов
/ 26 апреля 2018

Похоже, вы могли бы создать путь загрузки на веб-интерфейсе и запросить файл напрямую, примерно так:

location = loc.split("/");
path = "results/" + location[location.length - 1].split(".")[0] + "/" + ele.id();
window.location.href = path;
...