Node.js - отправка нескольких файлов в виде вложений с сервера на клиент - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть приложение, которое позволяет пользователю вводить несколько имен файлов в текстовые поля ввода, и при отправке эти имена файлов будут выбираться с SFTP-сервера, возвращаться обратно клиенту и загружаться.

Приложениевыглядит примерно так:

Application

Код для запроса POST выглядит так:

// Declare variables.
    var files = req.body.input;
    var i = 0;

    // Check if request body is an array or single value.
    if ( Array.isArray(files) ) {

        // Loop through the array of file names.
        function myLoop() {
            setTimeout(function() {

                // Declare the files remote and local paths as variables.
                var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files[i] + '.csv.gz';
                var localFilename = files[i] + '.csv.gz'

                // Use the SFTP Get command to get the files.
                sftp.get(remoteFilename).then((stream) => {

                    // Pass the file back to the client side for download.
                    res.set('content-disposition', `attachment; filename="${ localFilename }"`);
                    stream.pipe(res);
                });

                // Increment the counter.
                i++;

            }, 200)
        }
        myLoop();

    } else {

        // If the request body is a single value, declare the files remote and local path as a variable.
        var remoteFilename = '../mnt/volume_lon1_01/test/files/processed/' + files + '.csv.gz';
        var localFilename = files[i] + '.csv.gz'

        // Use the SFTP Get command to get the files.
        sftp.get(remoteFilename).then((stream) => {

            // Pass the file back to the client side for download.
            res.set('content-disposition', `attachment; filename="${ localFilename }"`);
            stream.pipe(res);
        });
    }

})

Мой вопрос такой:Как можно отправить несколько файлов для загрузки клиенту из этого кода на стороне сервера?

Я видел этот вопрос здесь: Отправка нескольких файлов по конвейеру , но данный ответ не даетне очень подробно решение.Я знаю, что мой код никогда не будет работать для нескольких файлов, я просто прикрепил его для демонстрации того, что у меня есть.Он отлично работает для загрузки 1 файла, но не более того, поскольку, насколько я понимаю, с ограниченными знаниями о сервере, заголовки отправляются один раз, поэтому я не могу установить имена файлов в цикле и отправлять их по одному.

Mscdex'sответ на вопрос, на который я ссылаюсь, объясняет:

Невозможно отправить несколько файлов, подобных этому, в одном ответе, если вы не используете свое собственное специальное форматирование (стандартное многочастное или иное), а затем анализируетеэто на стороне клиента (например, через XHR).

Может кто-нибудь объяснить и, возможно, продемонстрировать, что «Использование ваших собственных специальных средств форматирования», поскольку я, честно говоря, понятия не имею.

Кроме того, я хотел бы избежать архивирования файлов, если это возможно.

Большое спасибо заранее, G

1 Ответ

0 голосов
/ 22 ноября 2018

«Использование собственного специального форматирования» - это решение, которое может работать, но это будет нестандартное решение, которое также потребует пользовательского кода на стороне клиента (браузера)снять это.Я бы посоветовал против этого и использовал бы следующее: создание ZIP-файла.

В качестве альтернативы, в коде на стороне клиента вы можете обернуть каждый <input> в свой собственный<form>, и при нажатии кнопки Submit используйте бит JS-кода, который будет отправлять все эти формы.В этом случае каждая форма будет запускать одну загрузку, поэтому серверный код будет просто блоком else.

...