Actionscript 3 AS3韩元';无法将POST数据发送到浏览器-URLRequestHeader内容类型错误?

Actionscript 3 AS3韩元';无法将POST数据发送到浏览器-URLRequestHeader内容类型错误?,actionscript-3,post,urlrequest,Actionscript 3,Post,Urlrequest,我的AS3 Flash代码中有以下代码,它使用JPGEncoder在swf中截图,并将其发送到url,在那里我用PHP将其写入文件 我最近确实遇到过谷歌Chrome Pepperflash的问题,功能停止,页面无法重定向。未向save.php发送任何内容。通过改变 var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream"); 到 这似乎奏效了。到今天为止,虽然这在

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

我最近确实遇到过谷歌Chrome Pepperflash的问题,功能停止,页面无法重定向。未向save.php发送任何内容。通过改变

var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");

这似乎奏效了。到今天为止,虽然这在internet Explorer中有效,但在Chrome、Safari和Firefox中不再有效。我昨天看到Adobe发布了一个flash和flash player的更新/补丁-这可能与此有关吗

如果我删除以下内容:

var header:URLRequestHeader = new URLRequestHeader ("Content-type", "text/plain"); 
jpgURLRequest.requestHeaders.push(header);   
然后页面成功重定向,但
$GLOBALS['HTTP\u RAW\u POST\u DATA']
随后为空,因此无法创建图像文件

是否有一个替代的标题,我可以把这将解决这个问题

我的代码是:

AS3:

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');

Flash Player 13.0.0.214版引入了一些关键的安全修复。不幸的是,它还通过禁止更改给定给navigateToUrl()的请求中的任何头来破坏navigateToUrl()。这将中断POST请求,这些请求需要传入安全性/会话令牌头,甚至需要更改内容类型,如文本/xml等,就像您在示例中所做的那样


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

使用下面的代码,现在就可以让它工作了。利亚姆在Flash播放器问题上是正确的。现在,将保存图像和导航到url分为两个不同的功能:

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

Adobe建议使用如下所述的外部接口调用: 它使用JavaScript替换POST方法


不过,odd_duck提出的解决方案似乎更简单,如果能看到php代码,那就太好了。

现在我的回答可以解决这个问题了,也许这可以帮助你?Adobe已经提交了一个bug,因为13.0.0.214中引入的更改可能太严格了。投赞成票:我已经编辑了上面的答案,为您添加了php
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!:");
    }
}
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
}