Выбор файла для скачивания появляется только после закрытия node.js - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть очень простое приложение node.js, которое успешно обрабатывает файл (из огромной формы), но загрузка файла результатов не удалась. Скачать HTML

<p><input type="text" value = "tx-AllSerums.xlsx"><br> <a href="/transformed/tx-AllSerums.xlsx" download="All Serums.xlsx">Download transformed file</a> </p>

Файлы результатов записываются в структуру каталогов, из которой я запускаю узел («преобразованный» каталог находится в каталоге, в котором я запускаю узел). Когда я нажимаю на вышеупомянутую ссылку, я получаю вывод консоли, но нет диалога сохранения файла. (Должен ли сервер даже получить это событие?) Когда я убиваю сервер узла, появляется диалоговое окно сохранения файла. Конечно, сохранение не удается: ошибка сети. В настоящее время я запускаю все на своей рабочей станции: Ubuntu 18.04; Chrome 70.0.3538.77, узел v10.13.0

Я обнаружил, что диалоговое окно сохранения файла появляется, но очень долго после щелчка. Но сервер все еще работает, и операция сохранения все еще не выполняется: ошибка сети.

Добавление res.end () к блоку, перехватывающему щелчок при загрузке, немедленно вызывает диалог. Теперь я успешно загружаю файл нулевой длины. Как ни странно, я нахожу это обнадеживающим.

var formidable = require('formidable');
var util = require("util");
var http = require('http');
var url = require('url');
var fs = require('fs');
var java = require("java");
var proc = require("process");

java.classpath.push("/home/u0138544/fake/prep-1.jar");
java.classpath.push("/home/u0138544/fake/SRTDependancies-1.jar");
console.log(proc.cwd());
http.createServer(function (req, res) {
    txName = "";
    if (req.url == '/fileupload' && req.method.toLowerCase() == 'post') {
        var form = formidable.IncomingForm();
        form.keepExtensions = true;
        var excelFilePath;
        var origName;
        form.parse(req , function (err, fields, files) {
            excelFilePath = files.filetoupload.path;
            console.log("upload " + excelFilePath);
            origName = files.filetoupload.name;
            txName = "tx-" + origName.replace(/\s/g, "");
            console.log( "txname = " + txName);
            //just for formatter
            var clz = "edu.utah.camplab.xlsx.SampleReportTransformer";
            var tx = java.newInstanceSync(clz);
            java.callMethodSync(tx, "run", excelFilePath, "./transformed/" + txName);
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.write('<p>');
            res.write('<input type="text" value = "' + txName +'"><br>');
            res.write('<a href="transformed/' + txName + '" download="' + origName +'">Download transformed file</a></p>');
            return res.end();
        });
    }
    else if (req.url.includes('transformed') && 
        req.method.toLowerCase() == 'get') {
        console.log("download attribute doesn't work")
        res.end();
    }
    else {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
        res.write('<input type="file" name="filetoupload" label="Pick a file"><br>');
        res.write('<input type="submit">');
        res.write('</form>');
        return res.end();
    }
}).listen(15080);
...