Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/HTML5文件API将顺序文件读入多部分表单数据_Javascript_Html_Multipartform Data_Fileapi - Fatal编程技术网

Javascript/HTML5文件API将顺序文件读入多部分表单数据

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

我正在使用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].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]);
}