我尝试读取文件,从fileReader创建" FileContainer"和DataUrl,以便将其发送到web api。
我的问题是Api调用在我的对象创建之前触发,所以我将Null发送到api。这意味着如果我发送一个小文件,它就可以了。
我的读者代码看起来像这样
var reader = new FileReader();
reader.onload = (function (theFile) {
return function (e) {
var newFile = {
name: theFile.name,
type: theFile.type,
size: theFile.size,
lastModifiedDate: theFile.lastModifiedDate
}
var binaryString = e.target.result;
updloadedFile(newFile, binaryString, selectedFolder, scope, fileProgrss);
}
};
})(f);
reader.readAsDataURL(f)
我的http.post电话
function updloadedFile(file, data, selectedFolder, scope, fileProgrss) {
var dummyobj = {
Name: file.name,
Extension: file.name.split('.')[0],
Path: selectedFolder.Path,
DataString: data,
}
$http.post('/api/Files/Upload/',
JSON.stringify(dummyobj),
{
headers: {
'Content-Type': 'application/json'
}
}
).success(function (data2) {
}).error(function (data, status, headers, config) {
});
}
答案 0 :(得分:2)
您需要将FileReader
包裹在promise
function fileReader(file) { // perform async operation
var deferred = $q.defer();
var reader = new FileReader();
reader.onload = function() {
// Your reader.onload code here
deferred.resolve(reader.result);
};
reader.readAsDataURL(f);
return deferred.promise;
};
然后您可以像这样调用uploadedFile()
函数:
fileReader().then(function(result){
updloadedFile(..., ..., ..., ...)
});
通过使用promise
对象,您可以使用then
在完成时访问异步任务的结果。 <{1}}会在结果可用时立即运行。
如果您想了解有关承诺的更多信息,SO thread可以很好地解释承诺。
答案 1 :(得分:0)
我猜这里的问题是,你正在监听onload
,它会在每次读取操作时被调用,因此在开始时可能为空(reference),尝试将其更改为{ {1}}。
答案 2 :(得分:0)
我真的不需要在承诺中包装FileReader API调用。您可以这样做,但根据文档(https://developer.mozilla.org/en-US/docs/Web/API/FileReader)FileReader.onload
在数据准备好时调用。执行额外的deffered.resolved
以便能够使用then
只是一件好事。
我创造了一个小提琴。即使使用大文件,只有在数据可用时才会进行http调用。我的代码中没有发现错误。愿你可以用小提琴试试。