如何将 ByteArray(来自 Flash)和一些表单数据发送到 php?
Posted
技术标签:
【中文标题】如何将 ByteArray(来自 Flash)和一些表单数据发送到 php?【英文标题】:How can I send a ByteArray (from Flash) and some form data to php? 【发布时间】:2010-10-10 12:32:18 【问题描述】:我有一个用 Flash AS3 制作的画板,如下图:http://henryjones.us/articles/using-the-as3-jpeg-encoder
我想用 php 将 jpg 和一些来自 html 表单字段的数据发送到服务器。有没有办法强制 Flash 电影在按下提交按钮时传递图像文件?
【问题讨论】:
【参考方案1】:您可以使用HTTPService 发送数据。 Here's一个教程排序介绍。
【讨论】:
谢谢! ...我以前从未使用过 Flex。我会试试的。【参考方案2】:如果您不使用 flex,请尝试使用 URLLoader && URLrequest,将您的数据作为 POST 变量传递。
【讨论】:
我已经这样做了。问题是:我想在旁边发布一些表单数据。【参考方案3】:这有点棘手:您可以通过以下两种方式之一进行操作:
Arthem 在另一个帖子中发表了这篇文章:
这对我有很大帮助: http://www.quietless.com/kitchen/upload-bitmapdata-snapshot-to-server-in-as3/
你需要修改 URLRequestWrapper 插入字段 需要的名称和文件名。 这是我所做的:
bytes = '内容配置: 表格数据; name="' + $fieldName + '"; 文件名="';
它对标题进行了最多的格式化 因此服务器可以将其理解为 文件上传。
顺便说一句,如果你有一个 BitmapData 您可能需要将其编码为 JPEG 或 首先是 PNG。
而且我通常使用这个解决方案:
我没有使用 imageshack API,但您可能想尝试使用 adobe 的 JPGEncoder 类 - 这是一个传递用户名和 JPG 字节数组的快速示例,非常简单。
private function savePicToServer(bmpData:BitmapData):void
var jpgEncoder:JPGEncoder = new JPGEncoder(85);
var jpgStream:ByteArray = jpgEncoder.encode(bmpData);
var loader:URLLoader = new URLLoader();
configureListeners(loader);
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var request:URLRequest = new URLRequest(ModelLocator.BASE_URL + ModelLocator.UPLOAD_URL + "?user=" + ModelLocator.getInstance().username);
request.requestHeaders.push(header);
request.method = URLRequestMethod.POST;
request.data = jpgStream;
loader.load(request);
请注意,变量是作为查询字符串的一部分传递的。您不能像一些人建议的那样使用 URLVariables,因为 URLVariables 将存储在请求的数据属性中,我们已经使用它来传递 byteArray。
【讨论】:
【参考方案4】:我想将加密的授权代码从 Flash 与 JPG 图像一起发送到 PHP。在 get 变量中发布它是不合适的,所以我以这种方式解决了它。大多数代码是阶段快照的实际收集,但只是其中的特定区域。与此处相关的部分是使用 writeMultiByte 将加密密码附加到 jpb 图像信息的末尾。然后,我使用获取变量 url 字符串发送此密码的长度,以便 PHP 知道要截断结尾。
var stage_snapshot:BitmapData = new BitmapData(600, 120);
var myRectangle:Rectangle = new Rectangle(0, 0, 600, 120);
var myMatrix:Matrix = new Matrix();
var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(-101, -33);
myMatrix.concat(translateMatrix);
stage_snapshot.draw(stage,myMatrix,null,null,myRectangle);
trace ("creating JPGEncoder");
// Setup the JPGEncoder, run the algorithm on the BitmapData, and retrieve the ByteArray
var encoded_jpg:JPGEncoder = new JPGEncoder(100);
var jpg_binary:ByteArray = new ByteArray();
jpg_binary = encoded_jpg.encode(stage_snapshot);
var pw = cryptoSalt.encrypt("mysecretpassword");
**var pwLength = pw.length;
jpg_binary.writeMultiByte(pw,"us-ascii");**
trace ("stage snapshot taken");
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
var request:URLRequest = new URLRequest("savejpg.php?length1=" + pwLength);
request.requestHeaders.push(header);
request.method = URLRequestMethod.POST;
request.data = jpg_binary;
var loader:URLLoader = new URLLoader();
trace ("sending pic to php");
loader.load(request);
loader.addEventListener(Event.COMPLETE,finishSave);
接收PHP:
$pwlength = $_GET['length1'];
$jpg = $GLOBALS["HTTP_RAW_POST_DATA"];
$pw = substr($jpg, - $pwlength);
$jpg = substr($jpg,0,strlen($jpg) - $pwlength);
$filename = 'uploads/test.jpg';
file_put_contents($filename, $jpg);
file_put_contents("uploads/pw.txt",$pw);
【讨论】:
【参考方案5】:你可以使用 AMFPHP 或 Zend AMF,我刚刚完成了一个这样的项目,我的产品允许用户更改产品配色方案,然后将 ByteArray 数据和其他 AS3 对象直接输出到 PHP,并插入 mysql,你可以see my project和AMFPHP
所有PNG透明图片均由Flash生成,并发送到AMFPHP,PHP在服务器上生成PNG文件。
【讨论】:
以上是关于如何将 ByteArray(来自 Flash)和一些表单数据发送到 php?的主要内容,如果未能解决你的问题,请参考以下文章
在 Flash Player 中从 ByteArray 播放 FLV
在 PHP 中膨胀 Flash CompressionAlgorithm.DEFLATE ByteArray
如何将 bytearray 转换为 image 或 image 转换为 bytearray ?