node.js - 如何将文件从 angular7 上传到 Node.js 服务器

标签 node.js angular

我的 Node.js 代码通过 Postman 可以 100% 正常工作, 但在 Angular 上,当我发送 FormData 时,服务器中没有发生任何事情,没有错误,但文件未上传。 我如何通过 Angular 上传文件?

HTML 组件:

<form>
  <input type="file" (change)="OnFileSelected($event)" name='photo'>
  <button type='submit' (click)="OnUpload()">Save Post</button>
</form>

Ts 组件:

OnFileSelected(event){
  this.SelectedFile = event.target.files[0] as File;
}
OnUpload(){
  const form: FormData = new FormData();
  form.append('photo', this.SelectedFile, this.SelectedFile.name);
  //Convert to Json because 'Unexpected token - in JSON at position 0 at JSON.parse' error in server
  let responseBody: {} = JSON.stringify(form);
  this.http.post(URL, responseBody).subscribe(event => { console.log(event)}, err => {console.log(err)
    });
  }

Node.js 服务器:

const path = require('path');
const express = require('express');
const multer = require('multer');
const bodyParser = require('body-parser')
const router = express.Router();
const DIR = './uploads';
let storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, DIR);
  },
  filename: (req, file, cb) => {
    cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
  }
});
let upload = multer({ storage: storage });
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
router.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
  res.setHeader('Access-Control-Allow-Methods', 'POST');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});
router.post('/upload-image', upload.single('photo'),  async function (req, res) {
  console.log(req.body);
  if (!req.file) {
    console.log("No file received");
    return res.send({
      success: false
    });
  } else { 
    console.log('file: ',req.file);
    return res.send({
      success: true
    })
  }
});

最佳答案

您需要指定您的请求是表单数据请求:

// Create Form Data
const formData: FormData = new FormData();
formData.append('photo', this.SelectedFile, this.SelectedFile.name);

// Create options for the request
const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type': 'multipart/form-data', //     <-- IMPORTANT
    'Accept': 'application/json'
  })
};

this.http.post(URL, formData, httpOptions).subscribe(...)

关于node.js - 如何将文件从 angular7 上传到 Node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631206/

相关文章:

javascript - 用户通过oAuth2登录到github后找出用户名

node.js - 我如何填充 mongoosastic?

javascript - 下载内容类型为 Content-Type :multipart/mixed 的文件

angular - 延迟 observable 返回值,直到我从 Angular 5 的 HTTP 请求中获得结果

node.js - 将 Web 部署到 AWS Elastic Beanstalk 后,Sequelize 不起作用

node.js - 错误 - 使用 npm 安装 mariasql 包 - node.js

angular - 将 Electron 与 Angular 2 一起用于 Web 和桌面应用程序

mysql - 解决连接到 API 时出现的错误 404

node.js - Sequelize 查询多对多关系并访问对象

ios - 如何通过使用 Ionic2 在 iPhone/iPad 上点击返回键转到下一个输入?