文件上传失败的问题!很诡异!

黄金八岁 发布于 2011/11/20 09:55
阅读 1K+
收藏 0

大家好,我在制作一个flash头像上传剪裁的功能,但是遇到了文件无法保存问题

源码是这里的

http://www.cnblogs.com/darkangle/archive/2009/05/26/flash_avatar_maker.html

看上去很牛.

 

可以上传和用摄像头拍照获取头像,但是就是无法保存头像,不能上传头像!

这边是upload.php的代码

 

<?
@header("Expires: 0");
@header("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
define('SD_ROOT', dirname(__FILE__).'/');
$pic_id = time();//使用时间来模拟图片的ID.
$pic_path = SD_ROOT.'./upload/head/'.$pic_id.'.jpg';
//上传后图片的绝对地址
//$pic_abs_path = 'http://sns.com/avatar_test/avatar_origin/'.$pic_id.'.jpg';
$pic_abs_path = ''.$pic_path.'';
//保存上传图片.
if(empty($_FILES['Filedata'])) {
	echo '<script type="text/javascript">alert("对不起, 图片未上传成功, 请再试一下");</script>';
	exit();
}

$file = @$_FILES['Filedata']['tmp_name'];

file_exists($pic_path) && @unlink($pic_path);
if(@copy($_FILES['Filedata']['tmp_name'], $pic_path) || @move_uploaded_file($_FILES['Filedata']['tmp_name'], $pic_path)) 
{
	@unlink($_FILES['Filedata']['tmp_name']);
	/*list($width, $height, $type, $attr) = getimagesize($pic_path);
	if($width < 10 || $height < 10 || $width > 3000 || $height > 3000 || $type == 4) {
		@unlink($pic_path);
		return -2;
	}*/
} else {
	@unlink($_FILES['Filedata']['tmp_name']);
	echo '<script type="text/javascript">alert("对不起, 上传失败");</script>';
	exit();

	}

//写新上传照片的ID.
echo '<script type="text/javascript">window.parent.hideLoading();window.parent.buildAvatarEditor("'.$pic_id.'","'.$pic_abs_path.'","photo");</script>';
?>

每次上传都说是 对不起 上传失败

求高手解决!!

 

源码地址http://files.cnblogs.com/darkangle/avatar_test.rar

 

作者的话

 

 

网站里面经常会用到头像,不少网站上都使用Flsh来生成,今天正好看到一个Flash做得还不错,于是开始研究它的实现原理,下面是分析过程,不感兴趣的请直接跳过,到最后去下载源码包(在沙加的神舟本上测试通过),测试时请将 avatar_test 上传至网站根目录, 使用如果不正常的话多半是目录没有写权限, 请开启 avatar开头的三个子目录写权限. 特别申明, AvatarEditor.swf 由 bai.sohu.com 开发,版权归搜狐公司所有. 转载本文请注明出自 darkangle.cnblogs.com 谢谢 要分析它如何使用先从调用代码开始, 用firebug分别找到上传图片和摄像头的调用代码,大概是象这样的一段: <embed height="464" width="514" flashvars="type=photo&photoUrl=http://pic7.bai.sohu.com.cn/a/2009/05/26/09/43/1217a5c86c_0.jpg&photoId=167&postUrl=http://upload.bai.sohu.com/camera.do?snstoken=007eae692e8c665ea195d6702cf59d55*13L6RgykIeLsXCkoxJG_0D45NrXNbrepW0Lpy2-wDqfKYhnrFqBlt_pg3gi575FB&saveUrl=http://upload.bai.sohu.com/icon.do?snstoken=007eae692e8c665ea195d6702cf59d55*13L6RgykIeLsXCkoxJG_0D45NrXNbrepW0Lpy2-wDqfKYhnrFqBlt_pg3gi575FB" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" quality="high" src="http://s1.bai.itc.cn/r/f_v1243271361/album/avatar/AvatarEditor.swf"/> 给这个flash传进去几个参数,具体是什么意思暂不清楚, 往下慢慢分析. 从IE缓存文件中找到AvatarEditor.swf, 使用Sothink SWF Decompiler (特别版网上可以找到,我用的5.0版) 反编之, 虽然以前没做过flash, 不过看了一下里面的脚本,也不是太难,找到两个关键脚本: AvatarEditor.as 和 BinaryTransfer.as , 其中BinaryTransfer负责以二进制向指定的地址传送数据. 上面的几个参数:photoUrl是原始图片的URL,不论是用摄像头拍摄还是上传方式,服务器端需要返回一个原始图片的地址供AvatarEditor编辑使用, type=photo是上传方式或者是使用头像相册中的图片. type=camera时是使用摄像头, camera.do 是保存摄像头拍摄照片的脚本地址,注意后面需要加参数(因为拼接地址需要),这个示例中不需要,所以用一个无意义的radom参数代替, 否则最后请求的地址不正确. icon.do是保存缩略图的地址. photoId 是原始图片的id. 为了更清楚地了解post数据过程可以装一个fiddler, 监视post的地址以及返回值. 图片被保存后返回的是一些json数据,AvatarEditor根据这些数据决定上传成功还是失败,并通过外部js接口调用通知浏览器. 通过fiddler查看结合 BinaryTransfer 代码的分析得知 AvatarEditor 会把生成的jpg以二进制方式Post到服务器端,这样的话接收方式就有一些区别,而不是传统的表单上传文件的接收方式,调查一番后发现可以通过file_get_contents("php://input")来获取上传的二进制数据,再使用 file_put_contents(SD_ROOT.'./'.$new_avatar_path,file_get_contents("php://input")); 就可以写入目录文件内容,到此保存文件的问题就解决了,再用json返回一些必要数据给AvatarEditor 我在源码中已经添加了详细的注释请注意阅读。源代码打包下载 效果图:


 

以下是问题补充:

@黄金八岁:我直接下载官方的源码,也是调试不到,我的环境是wamp (2011/11/20 09:58)
加载中
0
北落
北落
那可能你环境的问题
0
xinyidt
xinyidt
同意楼上的观点
返回顶部
顶部