我已经继承了某些文件上传代码(不是继承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中的代码进行其他任何改进吗?我计划修改服务代码以允许上传多个文件,但是删除所有硬编码路径是优先事项。