node.js - 如何使用 Angular 2+、Express 和 nodeJs 上传文件

标签 node.js angular express file-upload multer

我正在尝试使用 Angular 4、node 和 Express 和 Multer 库上传图像。

这是我的 route.js :

const storage = multer.diskStorage({
destination: function(req, file, cb) {
    cb(null, 'uploads')
},
filename: function(req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + '.jpg')
   }
});

const upload = multer({ storage: storage }).single('avatar');


router.post('/upload_avatar', function(req, res) {
upload(req, res, function(err) {
    if (err) {
        // An error occurred when uploading
        throw err;
    }
    res.json({
        sucess: true,
        message: 'Image was uploaded successfully'
    });
    // Everything went fine
  })
});

如果我使用 Postman,它确实可以工作并将图像添加到我项目的上传目录中。

这是我的 UserService.js
import { Injectable } from '@angular/core';
import {Http, Headers, RequestOptions} from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class UserService {
  user: any;
  filesToUpload: Array<File> = [];

  constructor(private http: Http) { }

  uploadAvatar(event){
   let fileList: FileList = event.target.files;
   if(fileList.length > 0) {
    let file: File = fileList[0];
    let formData:FormData = new FormData();
    formData.append('uploadFile', file, file.name);
    let headers = new Headers();
    /** No need to include Content-Type in Angular 4 */
    // headers.append('Content-Type', 'multipart/form-data');
    // headers.append('Accept', 'application/json');

     this.http.post('http://localhost:3000/api/upload_avatar', formData, 
     {headers: headers})
        .map(res => res.json())
        .catch(function(err){
          throw err;
        })
        .subscribe(
            data => console.log('success'),
            error => console.log(error)
        )
  }
}

我的 profile.component.ts 使用这个函数:
 fileChangeEvent(event) {
 this.userService.uploadAvatar(event); 
}

最后我的 HTML 看起来像这样:
<div class="col-md-4">
            <img [src]="userImg" class="img-thumbnail" alt="">
            <input type="file" (change)="fileChangeEvent($event)" 
placeholder="Upload file..." />
            <!-- <button type="button" (click)="upload()">Upload</button> --
>
        </div>

当我使用 postman 时它可以工作,所以我想问题与 Angular 代码有关。
我也认为它必须与标题或正文请求有关。
这是我从 Node 服务器得到的错误:
      C:\Users\admin\Desktop\project\contactlist\routes\route.js:33
        throw err;
        ^
       Error: Unexpected field
       at makeError 

 node_modules\multer\lib\make-
  error.js:12:13)
  at wrappedFileFilter 
 node_modules\multer\index.js:40:19)
  at Busboy.<anonymous> \node_modules\multer\lib\make-middleware.js:114:7)
  at emitMany (events.js:127:13)
 at Busboy.emit (events.js:201:7)
  at Busboy.emit node_modules\busboy\lib\main.js:38:33)
at PartStream.<anonymous> ( 
node_modules\busboy\lib\types\multipart.js:213:13)
at emitOne (events.js:96:13)
at PartStream.emit (events.js:188:7)
at HeaderParser.<anonymous> (node_modules\dicer\lib\Dicer.js:51:16)
at emitOne (events.js:96:13)
at HeaderParser.emit (events.js:188:7)
at HeaderParser._finish (node_modules\dicer\lib\HeaderParser.js:68:8)
at SBMH.<anonymous> (node_modules\dicer\lib\HeaderParser.js:40:12)
at emitMany (events.js:127:13)
at SBMH.emit (events.js:201:7)

最佳答案

刚刚改变了这一行:

formData.append('uploadFile', file, file.name);

到:
formData.append('avatar', file, file.name);

现在它起作用了!

关于node.js - 如何使用 Angular 2+、Express 和 nodeJs 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335176/

相关文章:

javascript - Angular 在构造函数外部的函数中返回未定义

api - React Native/Expo : Fetch throws “Network request failed”

node.js - 编写服务端实现RPC客户端Node.js

javascript - Promise 流

c# - RabbitMQ 和 Web 服务

angular - 将服务的两个不同实例传递给组件的两个不同实例,一个通过路由器导出,一个通过 MatDialog

node.js - 是什么阻止了我的 Node.js 代码?从命令行获取参数

javascript - 通过 ngSubmit 提交时未定义 Angular 形式

javascript - MongoDB:尚未为模型 "User"注册架构

node.js - 如何通过.authenticate将变量传递给 Passport 策略?