【问题标题】:I am trying to upload file through node js using multer but I am not getting proper file我正在尝试使用 multer 通过节点 js 上传文件,但我没有得到正确的文件
【发布时间】:2018-11-16 23:37:09
【问题描述】:

我正在使用 Multer 在 Node js 中上传文件,但我没有得到正确的文件。我正在尝试上传图片。 我要把导入的文件上传到S3桶但是找不到文件,不知道哪里错了。

这是我的节点 js 代码:

 import "@tsed/multipartfiles";
    import Path = require("path");
    const rootDir = Path.resolve(__dirname);

    const aws = require("aws-sdk");
    import { Express } from "express";
    import { Controller, Post } from "@tsed/common";
    type MulterFile = Express.Multer.File;
    import { MultipartFile } from "@tsed/multipartfiles";

    @controller("/session")

export class TeleconsultSessionController implements interfaces.Controller {

 @httpPost("/uploadDocuments")
    public async uploadDocument( @MultipartFile() file: MulterFile, req: Request, res: Response) {
        try {                
            aws.config.update({ accessKeyId: "AKIAIYKXXXXXXXXX", secretAccessKey: "iMzE0wfryXXXXXXXXXXXXXXXXXXXX" });
            aws.config.update({ region: "us-east-1" });

            const s3 = new aws.S3();
            s3.upload({
                "Bucket": "teleconsult-development",
                "Key": "image",
                "Body": file
            }, function (err: any, data: any) {
                if (err) {
                    console.log("Error uploading data: ", err);
                } else {
                    console.log(data);
                }
            });
        }
        catch (err) {
            if (err instanceof ValidationException) {
                res.status(400);
                res.send({ error: err.getMessage() });

            } else {
                res.status(500);
                res.send({ error: err.getMessage() });
            }
        }

    }

作为回应,当我通过邮递员时,我将文件的值设为:

Object {------WebKitFormBoundaryAo1BhVpGaB8uYmsw\r\nContent-Disposition: form-data;名称:""image1"; 文件名="1528114981689_566_28-1-2

【问题讨论】:

标签: node.js amazon-s3 multer


【解决方案1】:

使用multer 上传文件将首先将文件保存在服务器的上传文件夹中,这取决于您的 multer 设置。

如果一个文件被multer成功上传,你会从req.file得到如下数据。

{ 
fieldname: 'file',
originalname: 'sample.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: './uploads/',
filename: 'd1fccf5dc0125937f6fbe7a4dacfc069',
path: 'uploads/d1fccf5dc0125937f6fbe7a4dacfc069',
size: 23904 
}

我将在下面的示例中使用的 path 值不是目录。 Multer 将更改您的文件名而不带扩展名。

您需要将上传的文件作为 fileStream 读取,然后将其上传到 S3 才能正常工作。

例如:

let path = req.file;
let fileStream = fs.createReadStream(file.path);
fileStream.on('error', function (err) {
    if (err) { throw err; }
});
fileStream.on('open', function () {
    s3.upload({
        "Bucket": "yourBucketName",
        "Key": file.originalname,
        "Body": fileStream
    }, function (err: any, data: any) {
        if (err) {
            console.log("Error uploading data: ", err);
        } else {
            console.log(data);
        }
    });
});

希望对你有所帮助。

【讨论】:

  • 我这样做了,但我得到的 API 路径不是确切的位置
  • 这是我的 API:localhost:3000/session/uploadDocuments 它给了我作为 D:/session/uploadDocuments 的路径
  • 但我没有得到 req.file 它是未定义的
  • 不,伙计,它仍然给我与未定义相同的错误文件
  • 您的文件需要上传为multipart/form-data
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2017-08-30
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多