2

1)i am uploading image from angular js 5 app and sending it to node js server, that file will be store at node js server in uploads folder.

2) i have used multer at backend (node js) to store uploaded file at server.

3) i have used both http and httpclient of angular js 5 respectively ,but still i am not getting uploaded file at server side.

4) when i send request to upload file through postman software , it works fine , but it can not work when i send request through angular js 5.

import { Component, OnInit } from '@angular/core';
import {HttpClient} from '@angular/common/http';
import { HttpHeaders,HttpRequest } from '@angular/common/http';
import {RequestOptions} from '@angular/http';

@Component({
  selector: 'app-file-upload',
  templateUrl: './file-upload.component.html',
  styleUrls: ['./file-upload.component.css']
})
export class FileUploadComponent implements OnInit {

  public url: string = "http://localhost:3000/Tasks";   // end point (node js)

  fileToUpload : File = null;

  constructor(private http: HttpClient) { }

  ngOnInit() {
  }

  fileChange(files : FileList)
  {       
    if(files.length > 0)
    {
      this.fileToUpload = files.item(0);
      console.log(this.fileToUpload.name);
      let formData : FormData = new FormData();
      formData.append('upload file',this.fileToUpload,this.fileToUpload.name);
   
    //  let headers = new Headers();
     // headers.append('Content-Type',undefined);
   
     // let options = new RequestOptions({ headers: headers });

     let headers = new HttpHeaders();
     headers.set('Content-Type','multipart/form-data');
     //let options =  {headers : headers}; 

      this.http.post(`${this.url}/upload`,{formData},{headers})
        .subscribe(
          res => {
            console.log(res);
          },
          err => {
            console.log("Error occured");
          }
        );  

    }   
  }

}
<div>
  <form  method="post" enctype="multipart/form-data">
    <input type="file" name="file" (change)="fileChange($event.target.files)" placeholder="Upload file"/>
  </form>
</div>

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';


import { AppComponent } from './app.component';
import { FileUploadComponent } from './file-upload/file-upload.component';
import { HttpClientModule } from '@angular/common/http';


@NgModule({
  declarations: [
    AppComponent,
    FileUploadComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

var express = require('express');
var router = express.Router();
var multer = require("multer");
var Task = require('../models/Task');
//var upload = multer({ dest: '../uploads/' })

var storage = multer.diskStorage({ //multers disk storage settings

    destination: function (req, file, callback) {

        callback(null, './uploads');

    },

    filename: function (req, file, callback) {

        var datetimestamp = Date.now();

        callback(null, file.fieldname + '-' + datetimestamp + '.jpg');

    }

});

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

/** API path that will upload the files */

router.post('/upload',function(req, res) {
    res.json({success: 'file uploaded successfuly ...'});
        upload(req,res,function(err){
        console.log('post() ..../////');
        console.log(req.file)
        if(err){

             res.json({error_code:1,nperr_desc:err});

             return;

        }
         res.json({
             error_code:0,err_desc:null,
             success: 'file uploaded successfuly ...'
             
            });           

    });    
 
});


module.exports = router;
davidkonrad
  • 83,997
  • 17
  • 205
  • 265

1 Answers1

0

I have managed to send a file from angular 5 to Nodejs with multer.

Make sure to you remove headers.set('Content-Type','multipart/form-data');

The Content-Type should not be applied on the request

The attribute for data file name sent ATTR_NAME formData.append('**ATTR_NAME**', this.fileToUpload, this.fileToUpload.name); should be the same with the multer({storage: storage}).single('**ATTR_NAME**');

Also no need for the braces on the post request. it should be

this.http.post( ${this.url}/upload , formData, {headers: this.setFileHeader() })

where the setFileHeader can look like this

setFileHeader() { return new HttpHeaders({ 'Accept': 'application/json', }); }

Marvine Bamba
  • 160
  • 2
  • 6