2

我的 AS3 Flash 代码中有以下代码,它使用 JPGEncoder 在 swf 中截取屏幕截图,并将其发送到我将其写入 PHP 文件的 url。

我最近确实遇到了 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。我看到 Adob​​e 昨天发布了 Flash 和 Flash 播放器的更新/补丁 - 这可能与它有关吗?

如果我删除以下内容:

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");
}

保存.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');
4

3 回答 3

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!:");
    }
}

保存图像.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
}
于 2014-05-15T19:02:53.197 回答
1

Flash Player 13.0.0.214 版引入了一些关键的安全修复。不幸的是,它还通过禁止更改提供给 navigateToUrl() 的请求中的任何标头来破坏 navigateToUrl()。这会破坏需要传递安全/会话令牌标头的 POST 请求,或者甚至更改 Content-Type,例如更改为 text/xml 等,就像您在示例中所做的那样。

现在,尽管很糟糕,但我们最著名的解决方法是将客户端降级到 13.0.0.206

于 2014-05-15T15:51:42.973 回答
0

Adobe 建议使用此处描述的外部接口调用:https ://forums.adobe.com/message/6396080 它使用 JavaScript 替换 POST 方法

不过,odd_duck 提出的解决方案似乎更简单 - 也很高兴看到 php 代码。

于 2014-05-21T00:00:12.953 回答