将块与Filepond一起上传到运行Express

时间:2019-06-24 18:16:12

标签: node.js express filepond tus

我需要使用Filepond将大文件(大于2GB)上传到运行Express的NodeJS服务器。这些文件需要(由于其大小)流式传输到两个位置...本地文件夹和远程文件夹。

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

的解决方案

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

有帮助吗?

Client.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()
                }
            }
        }
    }
})

Server.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)
});

0 个答案:

没有答案