4myht

    第一个项目差不多完成了,已经被我放上sinaapp了,地址是4myht,头像还是个问题,上传是可以了,就是转换大小方面还没解决,还要再看看。

现在基本上回归到正常的状态了,写项目那段时间,基本上除了睡觉的时间,都在想有关项目的事,坐公交的时候在想,洗澡的时候在想,吃饭的时候在想(觉得吃饭真浪费时间啊,可费劲了)跟大家一起吃饭,大家基本也都这么说,有说要是能吃颗药丸就好了的,这么有想法的话,大家应该猜得到是谁说的。整个项目最费时间的就是CSS和想出某个小问题或者功能的具体解决办法了,有好多问题,想通了数据表的结构,问题也就通了。让我印象最深的是签到和头像问题。其他的无非也就是插入数据,更新数据,遍历,逻辑理清楚了,就差不多了,有时候实现不了,完全是变量名没对上或者写错了这些略2的问题= =!

来说说签到,签到是在坐公交的时候想出来的解决办法。首先,当天签到之后,从第二天0点的时候才能进行下一次签到。怎么实现呢?签到之后肯定得有一个数据来记录签到时间,而且必须是存在数据表里的,而且必须和用户信息存在一起,那就可以在用户表中存放一个check字段,用来记录签到的时间戳,这个简单,签到完成后提交一下时间戳就行了。接下来得算出距离下一次可以签到的时间,也就是第二天0点。(插播一下,曼联0:2了。。。)可以先算出签到的时候这一天过了多久啦,直接用check字段%24小时的总秒数就可以了,也就是check%(24*60*60=86400),然后用 86400-(check%86400)就欧了。这样就算出距离下一次可以签到的时间了。然后用户签到的时候获取一下当前的时间戳,减去上一次签到的时间戳,跟86400-(check%86400)比较一下就好了。大于就可以签,小于就不能签,时间还没到,等于的话能不能签,就按你的想法来了。

接下来说说头像处理,头像上传大家都会,在数据库存地址就行了,输出的时候img一下。但是大小不好控制啊,上传的图片大小不一,尺寸和文件大小都不一啊,尺寸还好控制,页面显示的时候设定一下宽和高就行了,但是还得按比例啊,你得写公式,不然基本都是被拉伸的,因为你设定的宽高比跟用户上传的图片的宽高比相等的概率。。。。。。我不相信你猜得出(再插播一下,曼联0:3了。。。。。。)文件大小也是个大问题,上传的文件小了还好,大了的话多占服务器资源啊,每次页面上显示的时候要是太大,多浪费时间,我们写项目的时候感觉不出来,因为服务器和客户端都是我们的电脑,带宽没有问题,但是真的上线,问题就大了,图片一大加载多慢,我们又不是在韩国,我们还要面对网通到电信之间的距离,蛋疼。。。(女用户请乳酸)。所以肯定要转换图片大小。(强行插播:曼联1:3了,弗莱彻进球了)我们学过GD库,隐约记得有这样的函数。于是我翻开手册,其实是打开手册,因为是CHM格式,不是PAPER格式:D。找到了!



(刚刚断电了,曼联1:5了) 湿了。手册上就写了一个调整大小的例子:


  1. <?php// The file
  2. $filename = 'test.jpg';
  3. // Set a maximum height and width
  4. $width = 200;
  5. $height = 200;
  6. // Content type
  7. header('Content-type: image/jpeg');
  8. // Get new dimensions
  9. list($width_orig, $height_orig) = getimagesize($filename);
  10. if ($width && ($width_orig < $height_orig)) {
  11. $width = ($height / $height_orig) * $width_orig;
  12. } else {
  13. $height = ($width / $width_orig) * $height_orig;
  14. }
  15. // Resample
  16. $image_p = imagecreatetruecolor($width, $height);
  17. $image = imagecreatefromjpeg($filename);
  18. imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
  19. // Output
  20. imagejpeg($image_p, null, 100);
  21. ?>

把用户上传的头像,处理一下,就行了。然后发现按参数好多,搞昏了,当时从大半夜搞到吃早饭前才成功,当时写的很乱,实现了就觉得自己好牛逼啊。后来空下来,写成了这个函数:


  1. function resize($str="avatar",$width="80",$height="80",$pathNow="default/",$name='name',$deltmp=0){
  2. //$str:对应的是$_FILES[$str],即你所设定的文件上传框的name
  3. //$width:图片转换的最大宽度
  4. //$height:图片转换的最大高度
  5. //$pathNow:图片转换的目标路径
  6. //$name:图片转换的目标文件名
  7. //$deltmp:是否删除临时文件,1为删除,0为保留;删除图片可以减少占用的空间,不浪费服务器的资源,因为临时文件就相当于把用户上传的图片复制一份放在指定的文件夹里,图片转换完之后就可以删除了,因为已经生成了你想要的新图片
  8. if($_FILES[$str]['error']){
  9. switch($_FILES[$str]['error']){
  10. case 1:
  11. echo '上传头像超过upload_max_filesize';
  12. break;
  13. case 2:
  14. echo '上传头像超过max_file_size';
  15. break;
  16. case 3:
  17. echo '上传部分头像';
  18. break;
  19. case 4:
  20. echo '头像没有上传';
  21. break;
  22. case 6:
  23. echo '找不到临时头像夹';
  24. break;
  25. case 7:
  26. echo '头像写入失败';
  27. break;
  28. }
  29. exit('上传头像出错,请重新处理');
  30. }
  31. $sizeallow=2000000;
  32. if($_FILES[$str]['size']>$sizeallow){
  33. exit('上传头像大小超出上传限制,请重新选择头像');
  34. }
  35. $arrsub=explode('.',strtolower($_FILES[$str]['name']));
  36. $sub=array_pop($arrsub);
  37. $suballow=array('gif','jpg','png','jpeg','bmp');
  38. if(!in_array($sub,$suballow)){
  39. exit('不支持此格式的上传头像,请重新上传');
  40. }
  41. mimeallow=array('image/gif','image/jpg','image/jpe','image/jpeg','image/pjpeg','image/png','image/x-png','image/bmp');
  42. $mime=strtolower($_FILES[$str]['type']);
  43. if(!in_array($mime,$mimeallow)){
  44. exit('上传头像的类型不支持,请重新选择头像上传');
  45. }
  46. switch ($sub){ //获取文件后缀名,输出和生成图片用
  47. case 'jpg';
  48. $type='jpeg';
  49. break;
  50. case 'jpeg';
  51. $type='jpeg';
  52. break;
  53. case 'png';
  54. $type='png';
  55. break;
  56. case 'gif';
  57. $type='gif';
  58. break;
  59. case 'bmp';
  60. $type='wbmp';
  61. break;
  62. default:
  63. $type=$sub;
  64. }
  65. $tmpath='tmp/';
  66. if(!file_exists($tmpath)){
  67. mkdir($tmpath,0777,true);
  68. }
  69. $compath=$tmpath.'tmp_'.$name.'.'.$sub;
  70. if(is_uploaded_file($_FILES[$str]['tmp_name'])){
  71. if(move_uploaded_file($_FILES[$str]['tmp_name'],$compath)){ //到这段都是上传文件的内容(都是凯哥写的)
  72. $str_header='Content-type:'.$mime; //输出图片用
  73. header($str_header);
  74. list($widthOri,$heightOri)=getimagesize($compath); //运用公式获得以设定的最大宽,高为上限的等比例缩小的宽,高
  75. if($width&&($widthOri<$heightOri)){
  76. $width=($height/$heightOri)*$widthOri;
  77. }else{
  78. $height=($width/$widthOri)*$heightOri;
  79. }
  80. $imageDes=imagecreatetruecolor($width,$height);
  81. $input='imagecreatefrom'.$type;
  82. $imageOrg=$input($compath); //用imagecreatefromjpeg()等对应文件后缀名的函数载入上传成功的临时文件
  83. if($deltmp==1){
  84. unlink($compath); //是否删除临时文件,1为删除,0为保留(默认为保留)
  85. }
  86. imagecopyresampled($imageDes,$imageOrg,0,0,0,0,$width,$height,$widthOri,$heightOri); //转换图片
  87. if(empty($pathNow)&&empty($name)){ //如果目标文件路径和目标文件名都为空,则直接输出图片
  88. $output='image'.$type;
  89. $output($imageDes);
  90. imagedestroy($finalpath);
  91. }else{
  92. if(!file_exists($pathNow)){ //检查目标文件路径是否已经存在,不存在则创建路径
  93. mkdir($pathNow,0777,true);
  94. }
  95. $finalpath=$pathNow.$name.'.'.$sub; //设置目标文件路径和文件名
  96. $output='image'.$type;
  97. $output($imageDes,$finalpath); //使用imagepng();imagejpeg();imagegif()等函数生成图片
  98. }
  99. }
  100. }
  101. }

还有一点想说的,写项目的时候,一点都不觉得痛苦,反而很乐在其中,基本上都不想停,很喜欢那种专注的状态,不用去想其他什么乱七八糟的东西。开学自我介绍的时候我就说我看过好多遍《社交网络》(其实译名应该叫“404” :D),中间有句很经典的话:he's wired in.
wired in,这就是我想要的状态,也是我们需要的状态。


posted on 2011-10-26 09:47  springside5  阅读(221)  评论(0编辑  收藏  举报