У меня есть приложение, которое использует 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"
Каким-то образом это влияет на загрузку файла, и я не знаю, почему.