javascript - 从动态创建的表单输入上传多个文件
问题描述
我正在学习 MEAN 堆栈并在文件上传时遇到问题。我有一个公司表格:
this.companyForm = this.fb.group({
trucks: this.fb.array([]),
...
});
Trucks 字段是动态创建的:
newTruck(): FormGroup {
this.added = false;
return this.fb.group({
...
TLic: new FormControl(null, {
validators: [Validators.required]
}),
Lic: new FormControl(null, {
validators: [Validators.required]
}),
CMRLic: new FormControl(null, {
validators: [Validators.required]
})
})
}
addTruck() {
this.trucks().push(this.newTruck());
}
在保存表格上:
this.authService.createUserStep1(
...
this.companyForm.value.trucks
);
认证服务:
createUserStep1(... trucks: Array<any>) {
const AuthDataStep1: AuthDataStep1 = {
...
trucks: trucks
};
this.http.put(BACKEND_URL + "signupStep1/", AuthDataStep1).subscribe(
() => {
this.authStatusListener.next(true);
this.router.navigate(["auth/signupStep2"]);
},
error => {
this.authStatusListener.next(false);
}
);
}
我写入数据库的 Nodejs 控制器:
exports.createUserStep1 = (req, res, next) => {
...
for (i = 0; i < req.body.trucks.length; i++) {
const truck = new Truck({
...
TLic: req.body.trucks[i].file.TLic[0].filename,
Lic: req.body.trucks[i].file.Lic[0].filename,
CMRLic: req.body.trucks[i].file.CMRLic[0].filename,
});
Truck.create(truck);
}
})
}
文件上传中间件:
const multer = require("multer");
var path = require('path');
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "backend/truckdocs");
},
filename: (req, file, cb) => {
const name = file.originalname
.toLowerCase()
.split(" ")
.join("-");
cb(null, name + "-" + Date.now() + "." + path.extname(file.originalname));
}
});
module.exports = multer({ storage: storage }).fields([
{
name: "TLic", maxCount: 1
}, {
name: "Lic", maxCount: 1,
}, {
name: "CMRLic", maxCount: 1
}
]);
和路线
const express = require("express");
const UserController = require("../controllers/user");
const extractTruckFiles = require("../middleware/truckfiles");
const checkAuth = require("../middleware/check-auth");
const router = express.Router();
/*App*/
...
router.put("/signupStep1", checkAuth, extractTruckFiles, UserController.createUserStep1);
我想在表单中创建 x 辆卡车,并为每辆卡车上传 3 个文件(TLic、Lic、CMRLic)。实现这一目标的最佳方法是什么?我知道您需要时间来了解我的代码,我非常感谢您。
解决方案
这就是我在上传 3 张照片的电子商务中所做的。我已经用 MVC 模式完成了它,我在路由文件中调用了 multer。
const express = require("express")
const multer = require("multer");
const router = express.Router()
const productController = require("../../controller/vendor/product")
const app = express();
const fileStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "images");
},
filename: (req, file, cb) => {
cb(null, new Date().toISOString().replace(/:/g, '-') + '-' +file.originalname)
}
});
const fileFilter = (req, file, cb) => {
if(file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg') {
cb(null, true)
} else {
cb(null, false)
}
}
let filehandler = app.use(multer({storage : fileStorage, fileFilter: fileFilter }).array('image',3))
/* @GET product Page request */
router.get('/products', productController.getProduct)
/* @GET add product page Request */
router.get('/add-product', productController.getAddProduct)
/* @POST Request */
router.post('/add-product', filehandler, productController.postAddProduct)
/* @GET AJAX Request findind subcategory */
router.get("/getSubCategory/:id", productController.getSubCategory);
module.exports = router
推荐阅读
- npm - 安装私有 npm 包的问题
- python - python jarvis没有运行第2部分
- r - 看起来where子句中有一个错误
- amazon-web-services - 使用 AWS 托管区块链为 Hyperledger Fabric 网络实施 API 服务器时 DNS 解析失败?
- reactjs - 在应用程序中添加反应路线
- python - 在熊猫数据框的子集中设置列表
- javascript - RegExp 将反三角函数(例如 sin^(-1)(x))转换为适当的符号(例如 asin(x))
- postgresql - 为什么不能将标签添加到 terraform 模块中
- java - 我应该在 recyclerView 中使用 recyclerView 还是有更好的方法?
- javascript - 我无法显示 KML