我的AS3 Flash代码中有以下代码,它使用JPGEncoder在swf中截取屏幕截图并将其发送到url,我将其写入PHP中的文件。
我最近遇到了Google Chrome Pepperflash问题,该功能刚停止,页面无法重定向。什么都没有发送到save.php。通过改变
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
到
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "text/plain");
这似乎可以解决问题。截至今天虽然这适用于Internet Explorer但不再适用于Chrome,Safari,Firefox。我看到Adobe昨天向闪存和闪存播放器发布了更新/补丁 - 这可能与它有什么关系吗?
如果我删除以下内容:
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "text/plain");
jpgURLRequest.requestHeaders.push(header);
然后页面成功重定向,但$GLOBALS['HTTP_RAW_POST_DATA']
为空,因此无法创建图像文件。
是否有可以解决此问题的替代标题?
我的代码是:
AS3:
function createJPG(m:MovieClip, q:Number, fileName:String) {
var jpgSource:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
jpgSource.draw(stage);
var jpgScreenshot: BitmapData = new BitmapData(362, 310);
jpgScreenshot.copyPixels(jpgSource, new Rectangle(288, 89, 362, 310), new Point(0, 0));
var jpgEncoder:JPGEncoder = new JPGEncoder(q);
var jpgStream:ByteArray = jpgEncoder.encode(jpgScreenshot);
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "text/plain");
var jpgURLRequest:URLRequest = new URLRequest ("http://www.url.com/save.php");
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = URLRequestMethod.POST;
jpgURLRequest.data = jpgStream;
var jpgURLLoader:URLLoader = new URLLoader();
navigateToURL(jpgURLRequest, "_self");
}
save.php
$imagefile=''.$imageURL.'';
$fp = fopen($imagefile, 'wb');
fwrite($fp, $GLOBALS['HTTP_RAW_POST_DATA']);
fclose($fp);
header('Location: https://www.url.com/your-image.php');
答案 0 :(得分:2)
使用以下代码管理以使其正常工作。 Liam在Flash Player问题上是正确的。现在通过分离保存图像并导航到URL到2个不同的函数来工作:
function createJPG(m:MovieClip, q:Number, fileName:String) {
var jpgSource:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
jpgSource.draw(stage);
var jpgScreenshot: BitmapData = new BitmapData(362, 310);
jpgScreenshot.copyPixels(jpgSource, new Rectangle(288, 89, 362, 310), new Point(0, 0));
var jpgEncoder:JPGEncoder = new JPGEncoder(q);
var jpgStream:ByteArray = jpgEncoder.encode(jpgScreenshot);
var urlLoader:URLLoader = new URLLoader();
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var saveJPG:URLRequest = new URLRequest('http://www.url.com/save_image.php?name=filename';
saveJPG.requestHeaders.push(header);
saveJPG.method = URLRequestMethod.POST;
saveJPG.data = jpgStream;
urlLoader.addEventListener(Event.COMPLETE, goToCheckout);
urlLoader.load(saveJPG);
}
function goToCheckout(e:Event):void{
var url:String = 'http://www.url.com/show_image.php';
var request:URLRequest = new URLRequest(url);
try {
navigateToURL(request, '_self');
} catch (e:Error) {
trace("Error occurred!:");
}
}
save_image.php:
if(isset($GLOBALS["HTTP_RAW_POST_DATA"])){
$jpg = $GLOBALS["HTTP_RAW_POST_DATA"];
$path = "";
$id = $_GET["name"];
$file = $id;
file_put_contents($path.$file, $jpg);
echo "complete";
} else{
// error
}
答案 1 :(得分:1)
Flash Player 13.0.0.214版引入了一些关键的安全修复程序。不幸的是,它还通过禁止更改给予navigateToUrl()的请求中的任何头来打破navigateToUrl()。这会破坏需要传递安全/会话令牌标头的POST请求,甚至更改内容类型,例如像你在你的例子中那样使用text / xml等。
目前,尽管很糟糕,我们最着名的解决方法是将客户降级到13.0.0.206
答案 2 :(得分:0)
Adobe建议使用此处所述的外部接口调用:https://forums.adobe.com/message/6396080 它使用JavaScript来替换POST方法
odd_duck提出的解决方案似乎更简单 - 看看PHP代码也很棒。