我使用下面的方法通过ajax发布文件,照常工作。
是否可以(允许)将文件数据放入对象中,如方法b? 试着找到一种组织请求数据的方法。
一
// client side
var formData = new FormData();
var fileLength = $('input')[0].files.length;
for (var i = 0; i < fileLength; i++) {
formData.append("files[]", $('input')[0].files[i]);
}
// server side nodejs
var file = req.files.file;
// .. use file move file location or do other things
// { file:
// [ { fieldName: 'file[]',
// originalFilename: '....png',
// path:'....png',
// headers: [Object],
// size: 10854,
// name: '....png',
// type: 'image/png' } ] }
B'/ P>
// client side
var formData = new FormData();
var request = {};
request.image = {};
// request.image.description = 'str';
// ...
request.image.files = {};
request.image.files = $('input')[0].files;
var request = JSON.stringify(request);
formData.append("request", request);
// server side nodejs
// not working
// cant find the file
// output request.image.files only get list: [ { '0': {}, length: 1 }, [length]: 1 ]
更新
感谢@ guest271314和@ user4344980回答,现在我用FileReader
似乎会有效,但现在我还是有一些问题,
在appendFormData()
内我评论了var request = JSON.stringify(request);
取消注释后,request
对象将变为undefined
。
我测试了删除appendRequestDataWithImage()
是否正常。
似乎与reader.onload
有关的问题我不知道什么是错的?我想念一下吗?
function onclickSubmit() {
$('.submit').on('click', '.button', function() {
appendFormDataSubmit();
// self.global().requestPost(url, appendFormDataSubmit()).then(function(response) {
// });
});
}
function appendFormDataSubmit() {
return new Promise(function (fulfill, reject){
appendRequestDataWithoutImage().then(function(result) {
return appendRequestDataWithImage(result);
}).then(function(result) {
console.log(result);
return appendFormData(result);
}).then(function(result) {
console.log(result);
fulfill(result);
});
});
}
构建对象
function appendRequestDataWithoutImage() {
return new Promise(function (fulfill, reject){
var request = {};
request.data = {};
request.data.text = 'text';
fulfill(request);
});
}
然后对象添加文件
function appendRequestDataWithImage(request) {
return new Promise(function (fulfill, reject){
var files = self.el.data.find('.dataContainer .data.userInformation.image .content input')[0].files;
// console.log(files);
var file = files[0];
var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
// // request.data[file.name] = btoa(binaryString);
request.data.images = btoa(binaryString);
fulfill(request);
console.log('load done');
}
reader.readAsBinaryString(file);
});
}
然后对象附加到FormData
function appendFormData(request) {
return new Promise(function (fulfill, reject){
console.log(request);
// var request = JSON.stringify(request);
// console.log(request);
var formData = new FormData();
formData.append("request", request);
fulfill(formData);
});
}
答案 0 :(得分:1)
感谢HTML5,现在可以。您可以使用文件API从文件输入中读取用户选定的文件。然后,将其编码为Base64以允许您将其嵌入到JSON中。
将文件读取和编码到Base64的示例:http://jsfiddle.net/eliseosoto/JHQnk/
var handleFileSelect = function(evt) {
var files = evt.target.files;
var file = files[0];
if (files && file) {
var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
request.image.files[file.name] = btoa(binaryString);
};
reader.readAsBinaryString(file);
}
};
答案 1 :(得分:1)
ajax post文件与json对象发出请求数据,如
{
"data": {
"text": "text",
"images": binaryString
}
}
基于@ guest271314和@ user4344980响应
function onclickSubmit() {
$('.submit').on('click', '.button', function() {
appendFormDataSubmit();
// requestPost with appendFormDataSubmit() return
});
}
function appendFormDataSubmit() {
return new Promise(function (fulfill, reject){
appendRequestDataWithoutImage().then(function(result) {
return appendRequestDataWithImage(result);
}).then(function(result) {
return appendFormData(result);
}).then(function(result) {
fulfill(result);
});
});
}
构建对象
function appendRequestDataWithoutImage() {
return new Promise(function (fulfill, reject){
var request = {};
request.data = {};
request.data.text = 'text';
fulfill(request);
});
}
然后对象添加文件使用FileReader
function appendRequestDataWithImage(request) {
return new Promise(function (fulfill, reject){
var files = self.el.data.find('.dataContainer .data.userInformation.image .content input')[0].files;
var file = files[0];
var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
request.data.images = btoa(binaryString);
fulfill(request);
}
reader.readAsBinaryString(file);
});
}
然后对象附加到FormData
function appendFormData(request) {
return new Promise(function (fulfill, reject){
request = JSON.stringify(request);
var formData = new FormData();
formData.append("request", request);
fulfill(formData);
});
}
答案 2 :(得分:0)
没有。 $('input')[0] .files不会提供它是哪个文件或其内容。 javascript不允许访问本地文件。