需要帮助,以了解从现有代码中上传multer文件的情况

时间:2019-01-11 15:53:00

标签: node.js angular multer

我已经继承了某些文件上传代码(不是继承OOP,而是继承了前雇员),但是该文件上传代码有效,但是存在一些体系结构问题,包括硬编码的文件路径。问题是:即使在阅读了multer文档并看到了几个示例之后,我还是不完全了解multer在API级别从何处获取文件,文件名,尤其是文件路径

这曾经是一个巨大的代码块,需要复制时粘贴(叹气),我将其重构为可注入服务:

mycomponent.component.ts:

// called on click of an 'upload' button in a form on my template
    this.uploadService.uploadSingleFile(event.target.files, '/test_uploads_service');

upload.service.ts:

@Injectable()
export class UploadService {

  constructor(private http: HttpClient) { }

  uploadSingleFile(file_list, file_path) {
    const authToken = localStorage.getItem('id_token');
    const fileList: FileList = file_list;
    if (fileList.length > 0) {
      const file: File = fileList[0];
      const fname = Date.now() + file.name;
      const formData: FormData = new FormData();

      formData.append('uploadFile', file, fname );
      const headers = new HttpHeaders().set('Authorization', authToken);
      this.http.post(`${ environment.apiUrl + '/upload/upload_single'}`, formData, {headers: headers})
        .map(res => res)
        .catch(error => Observable.throw(error))
        .subscribe(error => console.log(error));
    }
  }

}

代码再次可以成功上传文件,但这是API中更神秘的地方:

upload.js:

router.post('/upload_single', passport.authenticate('jwt', {session: false}), (req, res) => {
    let storage = multer.diskStorage({
        destination: function (req2, file, cb) {
            cb(null, '../public_html/uploads/test_uploads/');
        },
        filename: function (req2, file, cb) {
            cb(null, file.originalname);
        }
    });

    let upload = multer({storage: storage}).single('uploadFile');

    upload(req, res, (err) => {
        if (err) {
            logger.error(err);
            res.json({success:false, message: 'Failed to upload image' + err});
        }
        else {
            res.json({success:true, message: 'Image uploaded successfully'});
        }
    });
});
  • 如何访问文件路径(“ / test_uploads_service”), 组件传递给服务并使用它来设置destination?我想消除 硬编码值('../public_html/uploads/test_uploads/')并使用 而是使用file_path变量。

  • 我不知道设置diskStorage文件名的匿名函数如何工作。 multer docs声称会添加到req.file中而无需阅读req,这个新的匿名函数神奇地知道了originalname属性的值...发生了吗?

  • 可以对upload.js中的代码进行其他任何改进吗?我计划修改服务代码以允许上传多个文件,但是删除所有硬编码路径是优先事项。

0 个答案:

没有答案