Javascript Vuejs:Axios post JSON数据和图像数据
目前,我正在创建一个包含图像数据和JSON数据的表单。我使用2POST方法将图像数据和JSON数据分别发布到我的nodejs后端。是否有任何可能的解决方案可以让我只通过使用axios和使用nodejs的后端发布一次图像和JSON数据 下面是我的代码 前端vue.jsJavascript Vuejs:Axios post JSON数据和图像数据,javascript,node.js,vue.js,post,axios,Javascript,Node.js,Vue.js,Post,Axios,目前,我正在创建一个包含图像数据和JSON数据的表单。我使用2POST方法将图像数据和JSON数据分别发布到我的nodejs后端。是否有任何可能的解决方案可以让我只通过使用axios和使用nodejs的后端发布一次图像和JSON数据 下面是我的代码 前端vue.js submitAuth() { console.log(this.promo.bannerImg) const formData = new FormData() formData.append('bannerImg',
submitAuth() {
console.log(this.promo.bannerImg)
const formData = new FormData()
formData.append('bannerImg', this.promo.bannerImg)
formData.append('inAppImg', this.promo.inAppImg)
formData.append('inAppImg', this.promo)
axios.post(`http://localhost:5000/success`,
this.promo
)
.then(response => {
console.log('Submit Success')
})
.catch(e => {
console.log('Submit Fail')
})
axios.post('http://localhost:5000/uploadImg',
formData
).then(response => {
console.log('Submit Success')
}).catch(e => {
console.log('Submit Fail')
})
},
app.post("/success", function (request, response) {
co(function* () {
var promouid = request.body.uid
var filename = __dirname + '/public/promo-json/' + promouid + '.json'
var promotionJSON = JSON.stringify(request.body)
fs.writeFile(filename, promotionJSON, 'utf-8', function (err) {
if (err) throw err;
console.log(request.body);
});
var stream = fs.createReadStream(filename);
var size = fs.statSync(filename).size;
var result = yield client.putStream(
'promojson/' + promouid + '.json', stream, {contentLength: size});
console.log(result);
}).catch(function (err) {
console.log(err);
});
});
app.post("/uploadImg", function (req, res) {
var storage = multer.diskStorage({
destination: 'public/image',
filename: function ( req, file, cb ) {
// set image name
console.log()
cb( null, 'asdasdsad-' + Date.now());
}
});
var upload = multer({
storage: storage,
}).any();
upload(req, res, function(err) {
if (err) {
console.log(err);
return res.end('Error');
} else {
console.log(req.body);
req.files.forEach(function(item) {
console.log(item);
});
res.end('File uploaded');
}
});
});
},
后端node.js
submitAuth() {
console.log(this.promo.bannerImg)
const formData = new FormData()
formData.append('bannerImg', this.promo.bannerImg)
formData.append('inAppImg', this.promo.inAppImg)
formData.append('inAppImg', this.promo)
axios.post(`http://localhost:5000/success`,
this.promo
)
.then(response => {
console.log('Submit Success')
})
.catch(e => {
console.log('Submit Fail')
})
axios.post('http://localhost:5000/uploadImg',
formData
).then(response => {
console.log('Submit Success')
}).catch(e => {
console.log('Submit Fail')
})
},
app.post("/success", function (request, response) {
co(function* () {
var promouid = request.body.uid
var filename = __dirname + '/public/promo-json/' + promouid + '.json'
var promotionJSON = JSON.stringify(request.body)
fs.writeFile(filename, promotionJSON, 'utf-8', function (err) {
if (err) throw err;
console.log(request.body);
});
var stream = fs.createReadStream(filename);
var size = fs.statSync(filename).size;
var result = yield client.putStream(
'promojson/' + promouid + '.json', stream, {contentLength: size});
console.log(result);
}).catch(function (err) {
console.log(err);
});
});
app.post("/uploadImg", function (req, res) {
var storage = multer.diskStorage({
destination: 'public/image',
filename: function ( req, file, cb ) {
// set image name
console.log()
cb( null, 'asdasdsad-' + Date.now());
}
});
var upload = multer({
storage: storage,
}).any();
upload(req, res, function(err) {
if (err) {
console.log(err);
return res.end('Error');
} else {
console.log(req.body);
req.files.forEach(function(item) {
console.log(item);
});
res.end('File uploaded');
}
});
});
如果您想使用一个请求来上传所有内容,那么您最好使用所有需要上传的内容 您可以获取JSON数据,将其序列化为字符串,然后将其与图像一起添加到FormData中 您的前端vue.js将如下所示:
const formData = new FormData();
// Add images to form data
formData.append('bannerImg', this.promo.bannerImg)
formData.append('inAppImg', this.promo.inAppImg)
formData.append('inAppImg', this.promo)
// Add the serialized JSON data to the formData (not
// sure what your JSON object is called)
formData.append('data', JSON.stringify(this.data));
// Submit the form data
axios.post('http://localhost:5000/uploadImg',
formData
).then(response => {
console.log('Submit Success')
}).catch(e => {
console.log('Submit Fail')
});
在后端,您只需对发送到JSON对象的FormData中的数据字段进行反序列化,然后就可以使用它。如果您希望使用单个请求来上传所有内容,则最好使用它来完成所有需要上传的内容 您可以获取JSON数据,将其序列化为字符串,然后将其与图像一起添加到FormData中 您的前端vue.js将如下所示:
const formData = new FormData();
// Add images to form data
formData.append('bannerImg', this.promo.bannerImg)
formData.append('inAppImg', this.promo.inAppImg)
formData.append('inAppImg', this.promo)
// Add the serialized JSON data to the formData (not
// sure what your JSON object is called)
formData.append('data', JSON.stringify(this.data));
// Submit the form data
axios.post('http://localhost:5000/uploadImg',
formData
).then(response => {
console.log('Submit Success')
}).catch(e => {
console.log('Submit Fail')
});
在后端,您只需反序列化发送到JSON对象的FormData中的数据字段,然后就可以使用它。如何在客户端将图像转换为Base64编码字符串,并在同一post请求中将其推送到服务器。您只需要在服务器上转换回文件。Ps:base64很可能是文件大小的两倍,您服务器上的压缩可以处理。我不认为转换为base64映像是将映像数据传递到后端的一个好做法。它有它的用例,据我所知,如果您已经在使用字符串,那么实践并不可怕。在保存之前,您甚至不需要解码。您可以将字符串保存在任何位置。如何在客户端将图像转换为Base64编码的字符串,并在同一post请求中将其推送到服务器。您只需要在服务器上转换回文件。Ps:base64很可能是文件大小的两倍,您服务器上的压缩可以处理。我不认为转换为base64映像是将映像数据传递到后端的一个好做法。它有它的用例,据我所知,如果您已经在使用字符串,那么实践并不可怕。在保存之前,您甚至不需要解码。您可以将字符串保存在任何位置。但是如何使用此文件上载图像?您可以使用与保存提交到/upload端点的文件相同的代码(
req.files.forEach(…)
)在/success端点中。您只需从其中一个FormData字段中检索JSON,然后循环浏览上载的文件并保存它们。但是图像是如何使用此字段上载的?您可以使用与保存提交到/success端点中的/upload端点(req.files.forEach(…)
)的文件相同的代码。您只需从其中一个FormData字段中检索JSON,然后循环浏览上传的文件并保存它们。