0

我需要使用Filepond将大文件(2GB+)上传到运行 Express 的 NodeJS 服务器。这些文件需要流式传输(因为它们的大小)到两个位置……一个本地文件夹和一个远程文件夹。

我的研究使我找到了使用tus-node-server https://github.com/pqina/filepond/issues/48的解决方案

我已经实现了如下所示的解决方案,但我不知道如何:
1. 在上传时更改文件的名称(它使用 UID,我想使用“元数据”属性中的文件名)
2 . 在上传期间或上传之后在服务器上执行一个函数。

有什么帮助吗?

客户端.js

Filepond.setOptions({
    server: {
        process: (fieldName, file, metadata, load, error, progress, abort) => {
            var upload = new tus.Upload(file, {
                    endpoint: `/upload`,
                    retryDelays: [0, 1000, 3000, 5000],
                    metadata: {
                        filename: file.name,
                        filetype: file.type
                    },
                onError: function(err) {
                    console.log("Failed because: " + err);
                    error(err)
                },
                onProgress: function(bytesUploaded, bytesTotal) {
                    progress(true, bytesUploaded, bytesTotal)
                },
                onSuccess: function() {
                    load(upload.url.split('/').pop())
                }
            })

            // Start the upload
            upload.start();

            return {
                abort: () => {
                    upload.abort()
                    abort()
                }
            }
        }
    }
})

服务器.js

const express = require('express');
const app = express();
const uploadApp = express();
const Client = require('ftp');
const path = require('path');
const tus = require('tus-node-server');

var tusServer = new tus.Server();

tusServer.datastore = new tus.FileStore({
    path: '/public/files'
});

uploadApp.all('*', tusServer.handle.bind(tusServer));

app.use('/public', express.static(path.join(__dirname, "/public")));
app.use('/upload', uploadApp);

app.listen(3000);

在尝试此方法之前,我app.post用于接收上传并执行进一步的操作。

app.post('/upload', (req, res, next) => {
    let uploadFile = req.files.file,
        fileName = req.files.file.name,
        ftp = new Client();

    uploadFile.mv(`${__dirname}/public/files/${fileName}`, err => {
        if (err) { return res.status(500).send(err) };
        res.json({ file: `public/${req.files.file.name}` })
    });

    ftp.on('ready', () => {
        ftp.put(fileName, `/ftppath/${fileName}`, err => {
            if (err) throw err;
            ftp.end();
        })
    })
    ftp.connect(ftpOptions)
});
4

0 回答 0