我在ActionScript 3中有一个关于POST文件上传的快速问题。我试图通过POST将ByteArray从内存上传到服务器。我正在使用URLRequest类发送数据和URLLoader,因为我想监视进度。相关的代码部分如下:
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而且没有即使在完成事件触发后,也会上传文件。
我已经使用简单的html表单验证了upload.php是否正常运行,我可以验证myByteArray是否包含所有相关数据。谁能告诉我我做错了什么?
修改
我尝试了一些我认为应该提及的新事物。第一种是将内容类型设置为application / octet-stream而不是multipart / form-data,除了将字节数增加到1964之外没有任何影响。我还检查了Apache错误日志,发现以下文本重复了很多:
PHP警告:第0行的未知中的multipart / form-data POST数据中缺少边界
我猜测Flash无论出于何种原因都没有正确格式化HTTP请求。鉴于我创建了一个FileReference,它使用我为URLLoader设置的相同方法从磁盘上传文件,并得到了预期的结果:bytesTotal属性与文件大小匹配,文件上传正确。
从那开始,我在Adobe开发人员文档中找到了一个页面,它提到了使用FileReference.upload()通过设置URLRequest的data参数将数据上传到服务器,所以我尝试了以下代码:
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:错误#2127:FileReference POST数据不能是ByteArray类型。
我真的被困在这里了。任何建议将不胜感激!
答案 0 :(得分:8)
您应该向“Content-Type”标题添加更多信息:
uploadRequest.contentType = "multipart/form-data; boundary=<<boundary here>>";