我有一个关于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);
Run Code Online (Sandbox Code Playgroud)
问题是我设置了我的回调以跟踪上传进度,并且ProgressEvent的bytesTotal属性总是1960(请求的大小减去数据?),即使实际数据大约是20MB并且没有上传文件即使在完成事件发生后也是如此.
我已经使用简单的html表单验证了upload.php的正常运行,我可以验证myByteArray是否包含所有相关数据.谁能告诉我我做错了什么?
编辑:
我尝试了几件我认为应该提及的新事物.第一种是将内容类型设置为application/octet-stream而不是multipart/form-data,除了将字节数增加到1964之外没有任何影响.我还检查了Apache错误日志,发现以下文本重复了很多:
PHP警告:第0行的Unknown中的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);
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
ArgumentError:错误#2127:FileReference POST数据不能是ByteArray类型.
我真的被困在这里了.任何建议,将不胜感激!
我正在尝试学习使用 Google Cloud Firestore 来存储和保护一些简单数据,因此我开始编写一些基本规则来验证从 API 传递的数据是否合理。
我最初的想法是每个规则都会被评估,如果任何一个规则失败,它就会使请求失败,但我发现请求和不匹配规则仍然成功。有人可以解释如何为子集合创建逐渐增强的安全规则吗?
这是我当前的规则集:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow write: if request.auth.uid != null;
}
match /projects {
allow write: if resource.data.keys().hasAll(['title', 'description']);
}
}
}
Run Code Online (Sandbox Code Playgroud)