我正在尝试使用multer通过节点js上传文件,但我没有得到正确的文件

时间:2018-06-07 06:54:19

标签: node.js amazon-s3 multer

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

这是我的节点js代码:

import { tap } from 'rxjs/operators';
import { AngularFireStorage } from 'angularfire2/storage';

import { AngularFirestoreCollection, AngularFirestoreDocument, AngularFirestore } from 'angularfire2/firestore';
import { Component, OnInit, Injectable } from '@angular/core';
import { AuthService } from './../auth.service';
import { DataService } from '../services/data.service';

import { News } from './../models/newsModel';
import { Observable } from 'rxjs';


@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.css']
})

@Injectable()

export class NewsComponent implements OnInit {

  news = {} as News;
  newsCol: AngularFirestoreCollection<News>;
  thenews: Observable<News[]>;
  imgUrl: Observable<any>;
  theData: News[] = [];


  constructor(public authservice: AuthService, public dataservice: DataService, public afs: AngularFirestore,
    private storage: AngularFireStorage) { }

  ngOnInit() {
    this.newsCol = this.afs.collection<News>('news');
    this.thenews = this.newsCol.valueChanges();
  }

  getImgUrl(img) {
    return this.storage.ref(img).getDownloadURL();
  }


  addNews(news) {
    this.dataservice.addNews(news);
  }


  onLogout() {
    this.authservice.onLogout();
  }

}

作为回应,当我点击邮递员时,我得到文件的值为:

对象{------ WebKitFormBoundaryAo1BhVpGaB8uYmsw \ r \ nConContent-Disposition:form-data; name:“”image1“; filename =”1528114981689_566_28-1-2

1 个答案:

答案 0 :(得分:0)

使用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);
        }
    });
});

希望这会对你有所帮助。