Javascript/HTML5文件API将顺序文件读入多部分表单数据
我正在使用HTML5文件API来组装多部分表单数据,以便通过XHR提交给web服务。我的整个工作都在FF中进行,FF在文件API的实现中包含了一个非常方便的getAsBinary()方法。这是一笔相当不错的交易。基本上是这样的:Javascript/HTML5文件API将顺序文件读入多部分表单数据,javascript,html,multipartform-data,fileapi,Javascript,Html,Multipartform Data,Fileapi,我正在使用HTML5文件API来组装多部分表单数据,以便通过XHR提交给web服务。我的整个工作都在FF中进行,FF在文件API的实现中包含了一个非常方便的getAsBinary()方法。这是一笔相当不错的交易。基本上是这样的: var const; // constructor const += headers; const += field_data; for(var i = 0; i < files.length; i++) { const += files[i].getA
var const; // constructor
const += headers;
const += field_data;
for(var i = 0; i < files.length; i++)
{
const += files[i].getAsBinary();
}
sendData(const);
var const;//建造师
const+=头;
常量+=字段数据;
对于(var i=0;i
工作得很有魅力
不过,为了让它在Chrome中工作,我必须创建一个FileReader对象,它的处理方式有点不同。我必须去:
var const; // constructor
const += headers;
const += field_data;
var reader = new FileReader();
for(var i = 0; i < files.length; i++)
{
reader.onload = (function(file)
{
const += file.target.result; // const is not in scope in this anonymous function!
}
reader.readAsBinaryString(files[i]);
}
sendData(const);
var const;//建造师
const+=头;
常量+=字段数据;
var reader=new FileReader();
对于(var i=0;i
这不起作用,主要有两个原因。首先,读取是异步进行的,所以当它到达sendData()时函数,文件数据不会写入常量变量。其次,常量变量超出reader.onload处理程序的范围。尽管我重新调整了代码,但我似乎遇到了这些障碍之一,我正在努力找到一种优雅的处理方法
有什么建议吗?您需要做的是让阅读器“加载”所有处理程序,以查看它们是否是最后一个运行的处理程序。当发生这种情况时,该处理程序可以调用“sendData()”
var const;//构造函数
const+=头;
常量+=字段数据;
变量读取器;
var=0;
对于(var i=0;i
(我不完全理解积累的“const”如何正确地转化为多部分MIME blob的细节,但我认为你做到了:-)同样,这可能很重要:我认为你可能需要为每个文件创建一个新的“FileReader”实例但这可能不正确,因为我对API及其语义不太熟悉。您是否考虑过
xhr.send(FormData)
?请参阅我的回答:
您可以将文件附加到FormData对象并通过xhr发送该对象
多部分的要求为你。我相信这是在FF4和已在铬
有一段时间。实际上是“常量”当然是在范围内,但范围不是问题。顺便说一下,这个问题做得很好。欢迎来到Stackoverflow!谢谢。我是时候去隐藏了。我抽象了const的东西。否则它会是一个混乱的边界和标题。这一点已经起作用了。啊,好吧。另一个替代方法是建立一些类似于jQuery中新的“延迟”功能。这是一个简单的想法,它基于小对象来维护“要做的事情”列表,以及在通知状态更改时调用其他事情的API。这将是封装“完成”计数器的维护的一种方法。我肯定正在研究这个问题。谢谢。
var const; // constructor
const += headers;
const += field_data;
var reader;
var finished = 0;
for(var i = 0; i < files.length; i++)
{
reader = new FileReader();
reader.onload = function(file)
{
const += file.target.result;
if (++finished === files.length)
sendData(const);
};
reader.readAsBinaryString(files[i]);
}