Путь URL, который включает параметр запроса Express JS, имеющий проблемы с загрузкой, по сравнению с чистой строкой того же текста - PullRequest
1 голос
/ 20 июня 2019

У меня есть приложение, которое использует Express.js для обслуживания своих статических страниц, а также для некоторых конечных точек, которые обрабатывают архивирование / сохранение файлов, которые пользователь затем может загрузить.

В моем обычном JS-приложении я звоню на сервер, чтобы попросить zip-архив, и синхронно жду ответа:

var params = {
    "save_id": saveID // "test"
}

var paramsString = jQuery.param(params)

var xhttp = new XMLHttpRequest()
xhttp.open("POST", "finaliseSave?" + paramsString, false);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send();

var archivePath = xhttp.response

Затем я загружаю файл:

window.open(archivePath)

На стороне сервера это выглядит так:

app.post("/finaliseSave", function(request, response) {
    var saveID = request.query["save_id"] // "test"

    //... prepare the file for the user to download ...

    //Download path to give to the user
    var downloadPath = "./tmp/" + saveID + ".zip" // "./tmp/test.zip"

    console.log(downloadPath) // "./tmp/test.zip"

    //Return the download path
    response.end(downloadPath);
})

Я могу перейти к файлу в своем каталоге /public/tmp/ и увидеть, что размер файла составляет 1,1 Мб - я даже могу скопировать его в папку загрузок, разархивировать и получить содержимое.

Однако этот файл, который был загружен с помощью строки window.open(), намного меньше - 808 КБ - и при попытке разархивировать его я получаю сообщение об ошибке «Невозможно развернуть (нет такого файла или каталога)».

Итак, если я заменю эту строку на моем сервере:

var downloadPath = "./tmp/" + saveID + ".zip" // "./tmp/test.zip"

с этим:

var downloadPath = "./tmp/" + "test" + ".zip" // "./tmp/test.zip"

(Я также могу добавить это под другим именем переменной, а затем console.log проверить на равенство между этим и исходным downloadPath, и он скажет мне, что они равны.)

А потом я возвращаю это downloadPath и звоню window.open(), он загружает файл правильно и разархивирует правильно.

Кажется, что есть некоторая разница между этими двумя:

var saveID = request.query["save_id"] // "test"
var saveID = "test" // "test"

Каким-то образом это влияет на загрузку файла, и я не знаю, почему.

...