【问题标题】:Express: Upload file directly to FTP without saving it in the storageExpress:直接将文件上传到FTP而不保存在存储中
【发布时间】:2022-11-15 23:51:10
【问题描述】:

所以我想从前端-> 后端-> FTP 服务器上传我的文件。我想上传它而不将其保存在后端。我想在后端收到我的文件后直接将其上传到 FTP 服务器。

我正在使用快递。

我目前的代码是:

baseServer.post(
  "/api/upload-image",
  upload.single('file'),
  function (req: Request, res: Response, next: NextFunction) {
    uploadToFTP(req, res, next);
  }
);

function uploadToFTP(req: Request, res: Response, next: NextFunction) {
  // sftp settings
  var storage = sftpStorage({
    sftp: {
      host: process.env.FTP_URL,
      port: process.env.FTP_PORT,
      username: process.env.FTP_USERNAME,
      password: process.env.FTP_PASSWORD,
    },
    destination: function (req: Request, file: any, cb: any) {
      cb(null, ""); // designation folder in host
    },
    filename: function (req: Request, file: any, cb: any) {
      // file name settings
      cb(null, file.fieldname + "-" + Date.now());
    },
  });

  var upload = multer({ storage: storage }).single("file");

  upload(req, res, function (err: any) {
    if (err) {
      console.log("Error Occured", JSON.stringify(err));
      res.json({ error: err });
    } else {
      console.log("Files uploaded successfully");
      res.json({ success: true});
    }
  });
}

有一个错误:

发生错误 {"storageErrors":[]}

请帮忙。


编辑

我像这样更改了我的代码:

import { NextFunction, Request, Response } from "express";
import { admin } from "../../middlewares/authMiddleware";
import { baseServer } from "../../server";

var multer = require("multer");
var sftpStorage = require("multer-sftp");
const upload = multer();

// sftp settings
var storage = sftpStorage({
  sftp: {
    host: process.env.FTP_URL,
    port: process.env.FTP_PORT,
    username: process.env.FTP_USERNAME,
    password: process.env.FTP_PASSWORD,
  },
  destination: function (req: Request, file: any, cb: any) {
    cb(null, ""); // designation folder in host
  },
  filename: function (req: Request, file: any, cb: any) {
    // file name settings
    cb(null, file.fieldname + "-" + Date.now());
  },
});

var uploadToFTP = multer({ storage: storage }).single('file');

baseServer.post(
  "/api/upload-image",
  upload.single("file"),
  function (req: Request, res: Response, next: NextFunction) {
    uploadToFTP(req, res, function (err: any) {
      if (err) {
        console.log("Error Occured", JSON.stringify(err));
        res.json({ error: err });
      } else {
        console.log("Files uploaded successfully");
        res.json({ success: true });
      }
    });
  }
);

错误:

发生错误 {"storageErrors":[]}


我的服务器.ts

我的 server.ts 有 bodyParser:

export const baseServer = express();
const PORT = process.env.PORT;
const bodyParser = require('body-parser');            

baseServer.use(express.json());
baseServer.use(bodyParser.json({limit:'50mb'})); 
baseServer.use(bodyParser.urlencoded({extended:true, limit:'50mb'})); 

上传的图片只有160kb。我不知道是什么问题。

【问题讨论】:

  • 如何将文件发送到服务器?你在baseServer 中使用 bodyParser 吗?
  • 是的,我的 baseServer 中设置了 bodyParser。请检查更新的问题以获取详细信息
  • 我不熟悉 multer,但根据文档,您必须仅提供 uploadToFTP 作为路由处理程序的回调函数来代替 upload.single("file")

标签: javascript angular typescript express multer


【解决方案1】:

最后我得到了这个工作:

import { NextFunction, Request, Response } from "express";
import path from "path";
import { baseServer } from "../../server";

var multer = require("multer");
var ftpStorage = require("multer-ftp");
const upload = multer();

const storage = new ftpStorage({
  ftp: {
    host: process.env.FTP_URL,
    secure: true, // enables FTPS/FTP with TLS
    user: process.env.FTP_USERNAME,
    password: process.env.FTP_PASSWORD,
  },
  destination: function (req: Request, file: any, options: any, callback: any) {
    callback(
      null,
      process.env.FTP_UPLOAD_PATH +
        file.fieldname +
        "-" +
        Date.now() +
        "." +
        file.mimetype.split("/").pop()
    ); // custom file destination, file extension is added to the end of the path
  },
});

const uploadToFTP = multer({ storage: storage }).single("file");

baseServer.post(
  "/api/upload-image",
  function (req: Request, res: Response, next: NextFunction) {
    uploadToFTP(req, res, function (err: any) {
      if (err) {
        console.log(err);
        res.json({ error: err });
      } else {
        res.json({
          success: true,
          path: path.join(
            process.env.IMG_URL ?? "",
            (res.req as any).file.path
          ),
        });
      }
    });
  }
);

我将库从 multer-sftp 更改为 multer-ftp,因为我的存储服务器没有 SSH 设置(由 sftp 使用)。

对于那些和我有同样问题的人,这个解决方案有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多