Как правильно закачать файл используя angular и multer? - PullRequest
0 голосов
/ 27 мая 2020

Проблема:

Я разработал загрузку файла с использованием angular и multer с express js. Но когда я пытаюсь загрузить файл, он продолжает выдавать эту ошибку.

enter image description here

onSelectImage(event) {
    const file: File = event.target.files[0];
    if (file) {
      if (file.size / 1048576 < 2) {
        if (file.type === "image/jpeg" || file.type === "image/png") {
          this.fileUploadService.onLoad(file).subscribe(data=>{
            console.log("upload +++++", data);
          })
          this.previewSelectedImage(file);
        } else {
          this.openSnackBar("Image type must be jpeg or png", "Error");
        }
      } else {
        this.openSnackBar(
          "Image size not match. Image size must be smaller than 2MB",
          "Error"
        );
      }
    }
  }

Это код моего служебного файла.

import { Injectable } from "@angular/core";
import {
  HttpClient,
  HttpHeaders,
  HttpEvent,
  HttpErrorResponse,
  HttpEventType,
} from "@angular/common/http";
import { map } from "rxjs/operators";
import {
  BASE_URL_ADMIN,
  BASE_URL_PATIENT,
} from "../../../app-main/config/enum.config";

@Injectable({
  providedIn: "root",
})
export class FileUploadServiceService {
  ref: any;

  constructor(private httpClient: HttpClient) {}

  onLoad(fileToUpload: File) {
    const path = BASE_URL_PATIENT + "user/patPic";
    let headers = new HttpHeaders();
    const formData = new FormData();
    formData.append("patPic", fileToUpload, fileToUpload.name);
    console.log(formData);
    console.log(fileToUpload.name);
    return this.httpClient.post(path, formData, {
      headers,
      reportProgress: true,
      observe: "events",
    });
  }
}

Вот как я написал код в контроллере express. js.

const multer = require("multer");
const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null,  "./uploads/");
  },
  filename: function(req, file, cb) {
    cb(null, new Date().toISOString().replace(/:/g,'-') + file.originalname);
  }
});

const fileFilter = (req, file, cb) => {
  //reject file
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png" || file.mimetype === "application/pdf") {
    cb(null, true);
  } else {
    cb(null, false);
  }
};
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 //1Mb
  },
  fileFilter: fileFilter
});


router.post("/patPic", upload.single("patPic"), (req, res, next) => {
  console.log(req.file);
  res.status(200).json({ fileSrc: req.file.path });
});

В файле index. js Я настроил политику перекрестного происхождения.

app.use(function(req, res, next) {
    var allowedOrigins = [
      "http://localhost:4200"
    ];
    var origin = req.headers.origin;
    console.log(origin)
    console.log(allowedOrigins.indexOf(origin) > -1)
    // Website you wish to allow to
    if (allowedOrigins.indexOf(origin) > -1) {
      res.setHeader("Access-Control-Allow-Origin", origin);
    }

    // res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

    // Request methods you wish to allow
    res.setHeader(
      "Access-Control-Allow-Methods",
      "GET, POST, OPTIONS, PUT, PATCH, DELETE"
    );

    // Request headers you wish to allow
    res.setHeader(
      "Access-Control-Allow-Headers",
      "X-Requested-With,content-type,Authorization"
    );

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader("Access-Control-Allow-Credentials", true);

    // Pass to next layer of middleware
    next();
  });

И в журнале сервера при загрузке файла он показывает этот журнал на сервере.

SyntaxError: Неожиданный токен - в JSON в позиции 0 в JSON .parse () в createStrictSyntaxError (/home/hrm/Generalpublicapp/node_modules/body-parser/lib/types/json.js:158:10) в parse (/ home / hrm / Generalpublicapp / node_modules / body- parser / lib / types / json. js: 83: 15) в /home/hrm/Generalpublicapp/node_modules/body-parser/lib/read.js:121:18 в invokeCallback (/ home / hrm /Generalpublicapp/node_modules/raw-body/index.js:224:16) при завершении (/home/hrm/Generalpublicapp/node_modules/raw-body/index.js:213:7) на IncomingMessage.onEnd ( / home / hrm / Generalpublic app / node_modules / raw-body / index. js: 273: 7) в IncomingMessage.emit (events. js: 322: 22) в endReadableNT (_stream_readable. js: 1187: 12) в processTicksAndRejection (internal /process/task_queues.js:84:21)

Может ли кто-нибудь помочь мне решить эту проблему? Я много пытался найти решение этой проблемы. Но я не смог этого сделать. Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...