2012-03-04 71 views
6

我有一个关于ActionScript 3中的POST文件上传的快速问题。我试图通过POST上传一个ByteArray通过POST到服务器。我使用URLRequest类来发送数据,而URLLoader是因为我想监视进度。代码的有关章节如下:POST文件上传使用URLRequest

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.contentType = "multipart/form-data"; 
uploadRequest.data = myByteArray; 

var uploader:URLLoader = new URLLoader; 
uploader.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
uploader.addEventListener(Event.COMPLETE, onUploadComplete); 
uploader.dataFormat = URLLoaderDataFormat.BINARY; 
uploader.load(uploadRequest); 

的问题是,我已经把我的回调,以跟踪上传进度,以及ProgressEvent的bytesTotal属性始终是1960年(请求减去数据的大小?)即使实际数据大约为20MB,即使Complete事件触发后也没有文件上传。

我已验证upload.php的功能是否正确,使用简单的html表单,我可以验证myByteArray是否包含所有有问题的数据。谁能告诉我我做错了什么?

编辑:

我已经尝试了几个,我想我应该提到新的东西。首先是将内容类型设置为application/octet-stream而不是multipart/form-data,除了将字节数增加到1964之外,它没有任何效果。我还检查了Apache错误日志,发现以下文本重复了很多:

PHP Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0

我猜测Flash并没有正确地格式化HTTP请求,无论出于何种原因。鉴于我创建了一个FileReference,它使用我为URLLoader设置的相同方法从磁盘上载文件,并获得了预期结果:bytesTotal属性与文件大小匹配并且文件正确上传。

从我在提到使用调用FileReference.upload数据上传到服务器Adobe开发文档发现了一个工作页面()通过设置URLRequest的数据参数,所以我尝试下面的代码:

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.data = myByteArray; 

fileRef = new FileReference; 
fileRef.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
fileRef.addEventListener(Event.COMPLETE, onUploadComplete); 
fileRef.upload(uploadRequest); 

这就造成了以下的输出:

ArgumentError: Error #2127: FileReference POST data cannot be type ByteArray.

我真的被困在这里。任何建议,将不胜感激!

+0

你试过 - uploadRequest.contentType = “应用程序/八位字节流”; – Neil 2012-03-05 15:32:35

+0

同样的结果,唯一的区别是bytesTotal是1964(四个额外的字符)。尽管谢谢你的建议! – 2012-03-05 21:06:45

+0

对有兴趣的人进行快速更新。我检查了Apache错误日志,并试图将文件结果上传到这一行:“PHP警告:缺少第0行未知的多部分/表单数据POST数据中的边界” – 2012-03-05 21:44:36

回答

8

您应该添加更多的信息到 “内容类型” 标头:

uploadRequest.contentType = "multipart/form-data; boundary=<<boundary here>>"; 

入住这里的例子:http://marstonstudio.com/?p=36

+0

工作正常!非常感谢!我认为Flash会为我添加边界。难怪它没有工作。 – 2012-03-07 00:41:08

+0

很高兴听到它。 :) – deadrunk 2012-03-07 08:00:07

+3

链接已损坏 – Soid 2015-04-15 07:34:36