使用FlashActionScript设置PHP会话变量

使用FlashActionScript设置PHP会话变量,php,flash,actionscript-3,Php,Flash,Actionscript 3,我有一个简单的PHP上传脚本,它是从我的Flash应用程序调用的。我确信它会打电话,因为它确实上传了文件 session_start(); $default_path = 'files/'; $target_path = ($_POST['dir']) ? $_POST['dir'] : $default_path; if(!file_exists($target_path)) mkdir($target_path, 0777, true); $destination = $target

我有一个简单的PHP上传脚本,它是从我的Flash应用程序调用的。我确信它会打电话,因为它确实上传了文件

session_start();

$default_path = 'files/';

$target_path = ($_POST['dir']) ? $_POST['dir'] : $default_path;

if(!file_exists($target_path)) mkdir($target_path, 0777, true);

$destination = $target_path . basename( $_FILES[ 'Filedata' ][ 'name' ] );

$file_name =  rand(1,9999).$_FILES[ 'Filedata' ][ 'name' ];

if(move_uploaded_file($_FILES[ 'Filedata' ][ 'tmp_name' ], $destination)){

$_SESSION['path'] = 'flashuploader_online/upload/'.$destination;

}
但是,我尝试在另一个脚本中使用会话变量“path”,但它给了我一个空值!是的,我已确保使用session_start

我错过什么了吗

更新
至少现在我知道问题出在哪里了!但我不知道如何解决这个问题,而不让跨会话变量的传递变得混乱。有什么想法吗?

您必须通过将会话id作为变量传递,在所有请求中持久化会话id。我保证不会弄得太乱!您需要对显示flash及其发布到的脚本的页面进行一些更改。您还需要对Flash应用程序本身稍作更改,以便它在将文件上载到服务器时可以包含会话ID

首先,您希望通过将会话ID包含在FlashVar中来为flash提供会话ID。您需要使用PHP对显示flash的页面进行预处理,否则无法持久化会话。确保在输出闪存的页面中调用会话_start()。你会得到这样的结果:

<object classid="clsid:(blah)" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="800" height="800" id="ZoomifyHotspotViewer">
  <param name="flashvars" value="phpsessionid=<? print session_id(); ?>">
  <param name="src" value="YourSWF.swf">
  <embed flashvars="phpsessionid=<? print session_id(); ?>" src="YourSWF.swf" pluginspage="http://www.adobe.com/go/getflashplayer" type="application/x-shockwave-flash" width="800" height="800" name="YourSWF"></embed>
</object>
这将手动强制PHP使用指定的ID续订保存的会话。这甚至不应该是您必须处理的问题,但如果是,您可能需要在下一页上执行类似操作,用户也会继续执行,或者在所有页面中添加一个通用案例:

if (isset($_REQUEST['PHPSESSID'])) {
  session_id($_REQUEST['PHPSESSID']);
}
session_start();

如果您最终需要以这种方式调用session_id()作为setter,请确保在调用session_start()之前

每当web服务器向您提供响应(页面、图形等)时,它都有机会向您的浏览器发送cookie

1) 每个cookie只会发送回它最初来自的同一个网站 2) cookie的“内容”(它包含的数据)只能由web服务器已经知道的任何信息组成

所以浏览器会自动发送HTTP头中“Cookie”变量中的Cookie。您可以使用PHP中的以下命令阅读:

$headers = apache_request_headers();
echo $headers['Cookie'];

服务器(如果在PHP配置中启用了会话支持)会在cookie中自动创建PHPSESSID(您可以在配置中修改变量名),您可以使用上述脚本直接访问它(您需要解析$headers才能获取PHPSESSID变量或任何其他cookie)。我认为没有必要使用flashvars,您的浏览器会自动在HTTP头中添加Cookie变量


希望这有帮助

你确定move_uploaded_file()返回true吗?是的,我现在在文本文件的帮助下确定了。upload.php中设置的session_id与我试图通过继续使用它来使用的另一个session_id完全不同!这是因为Flash是客户端,PHP是服务器端吗?这正是我所采取的方法。:)不过,我还有一个问题,值得提出另一个问题。:)我认为没有必要使用flashvars,您的浏览器会自动在HTTP头中添加Cookie变量。看看我的答案。@Dustin Fineout:首先,对于这个伟大的答案,stackoverflow不允许我做一次以上的投票(但这确实是一个很好的答案。我对我的项目也有类似的问题,我想为什么会发生这种情况?但你做得很好,但我还是很好奇为什么我必须将会话id传递给我的上传脚本?请你从PHP/Flash方面解释一下真正的问题是什么。这是因为当Flash发送请求时,它不会在cookie中包含任何会话id。因此,当上载脚本收到请求时,它无法加载现有会话。通过显式传递会话id,我们为上载脚本提供了一种识别和持久化会话的方法。是的,大多数浏览器都会这样做,这就是您通常不需要任何特殊帮助的原因向服务器发送请求时闪存本身没有在cookie中包含会话id,这是导致此问题的实际原因。
if (isset($_REQUEST['PHPSESSID'])) {
  session_id($_REQUEST['PHPSESSID']);
}
session_start();
$headers = apache_request_headers();
echo $headers['Cookie'];