Узел / Экспресс: файл не загружается с помощью fs.pipe () - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблема с загрузкой файлов на локальный компьютер с помощью fs.pipe () в моем облачном литейном приложении Node.js / Express.

По сути, запрос POST отправляется на мой код на стороне сервера.содержит имя файла, который хочет загрузить мой пользователь.Я получаю доступ к файлу с помощью команды GET из модуля npm ssh2-sftp-client.Наконец, этот файл сохраняется в папке локальных загрузок пользователей с помощью папки загрузок модуля npm, чтобы определить это местоположение.Код выглядит следующим образом:

app.post('/download-file', function(req, res) {

    // Declare the files remote and local path as a variable.
    const remoteFilename = 'invoice/csv/' + req.body.file;
    const localFilename = downloadsFolder() + '/' + req.body.file;

    // Use the SFTP GET command to get the file passing its remote path variable.
    sftp.get(remoteFilename).then((stream) => {

        // Download the file to the users machine.
        stream.pipe(fs.createWriteStream(localFilename));

        // Redirect user.
        res.redirect('/invoice')
    });
})

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

Local

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

Hosted

У меня нетИдея, почему это так, этот код прекрасно работает в Chrome, Safari при локальном запуске, но при размещении ничего не делает.Кто-нибудь может объяснить, что здесь происходит не так?

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

1 Ответ

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

// Загрузка файла на компьютер пользователя.

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

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

sftp.get(remoteFilename).then((stream) => {
  res.set('content-disposition', `attachment; filename="${ req.body.file }"`);
  stream.pipe(res);
});

Когда файл предлагается в качестве «вложения», он обычно открывает окно загрузки браузера и браузер остается на той же странице.Вы не можете одновременно выполнять потоковую передачу и , но поскольку браузер не меняет URL-адрес, все должно быть в порядке.

Кроме того, у вас нет контроля над тем, где пользователь будетзагрузить файл в .Это может быть папка загрузок, но они могут выбрать другую папку.

...