最近在写一个文件上传的功能,主要分为图片,音频以及视频的上传,由于是要求异步上传,所以就偷懒的使用ajaxuploadfile.js这个已有的jquery的扩张。截止到作者写此文章ajaxuploadfile.js最新版本为2008出现的,已经有五六年不曾有人更新,其中具体的源代码笔者也未深究。由于版本过于古老所以此js插件不能兼容最新版的jqery(读者自行取舍)。
文件上传
ajaxuploadfile.js是使用iframe嵌套来达到异步上传文件的效果,所以在我们进行上传操作时可能会为我们的调试带来一些不必要的麻烦。不过可以使用返回值打印来定位错误的位置。该插件的返回值可谓json或者content等值,不过在返回json值时笔者一直未调试通过(这就是偷懒不喜欢看源码所付出的代价),所以笔者退而求其此使用直接返回文本的格式来调用该插件。fileElementId为上传文件属性的id值,在写html文件时可不使用form表单,因为在ajaxuploadfile.js插件中会自动生成。以下为js的调用使用方式实例。
// Asynchronous upload file by ajaxfileupload.js function ajaxFileUpload() { $.ajaxFileUpload ( { url:'uploadFile.php', secureuri:false, fileElementId:'file', dataType: 'Content', success: function (data, status) { if(data === "fileError01"){ alert('文件大小不得超过2M'); }else if (data === "fileError02"){ alert('文件格式不正确'); }else{ alert("文件上传成功!"); } }, error: function (data, status, e) { alert(e); } } ) return false; }
后台处理php的基本编码如下(以上传图片为例):
$uploadImgType = array("image/jpeg", "image/gif", "image/png"); //define maxes size of image (2M) $imgMaxSize = 2000000; //get basic information of uploading file $fileInfo = $_FILES["file"]; //test the file type and size if ($fileInfo["size"] > $imgMaxSize) { echo "imageError01";return; } if (!in_array($fileInfo["type"], $uploadImgType)) { echo "imageError02";return; } //get uploaded image information $imageInfo = getimagesize($fileInfo["tmp_name"]); $imageName = $fileInfo["name"]; $imagePathInfo = pathinfo($imageName); $imageExt = strtolower($imagePathInfo["extension"]); //create new image name $imageNewName = mt_rand(0, 999999); $imageServPath = UPLOADFILEPATH . '/' . $imageNewName; //upload image if(!move_uploaded_file($fileInfo["tmp_name"], $imageServPath)){ echo "<javascript>alert('upload Failure!!')</javascript>"; exit; }
图片缩略图的实现
php中图片的处理一般需要加载gd库,实现缩略图的思想根据图片的宽度实现图片的等比例缩小,如果给出的图片宽大于原先的图片宽度则将原图片作为缩略图,具体实现如下:
function mMakeThumbnail(& $srcImgPath, & $width, & $ext) { //get source image size $imageSize = GetImageSize($srcImgPath); // file_put_contents("./file_infor.php",$imageSize); //defined thumbnail path $thumbnailPath = mt_rand(0, 999); //test image type switch ($imageSize[2]) { case 1: $srcImg = @ImageCreateFromGIF($srcImgPath); break; case 2: $srcImg = @ImageCreateFromJpeg($srcImgPath); break; case 3: $srcImg = @ImageCreateFromPNG($srcImgPath); break; default: $this->Err_SetErrNo("666"); return ; } //get source image width and height $srcImgWidth = imageSX($srcImg); $srcImgHeight = imageSY($srcImg); if ($srcImgWidth > $width) { //Calculation ratio of zoom $ratio = $width / $srcImgWidth; $height = round($srcImgHeight * $ratio); //test function imagecopyresampled exist if(function_exists("imagecopyresampled")){ $newImg = imagecreatetruecolor($width, $height); imagecopyresampled($newImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcImgWidth, $srcImgHeight); }else{ $newImg = imagecreate($width, $height); imagecopyresized($newImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcImgWidth, $srcImgHeight); } //create thumbnail switch ($imageSize[2]) { case 1: ImageGIF($newImg,$thumbnailPath); break; case 2: ImageJpeg($newImg,$thumbnailPath); break; case 3: ImagePNG($newImg,$thumbnailPath); break; default: $this->Err_SetErrNo("666"); return; } //destroy tmp image ImageDestroy($newImg); ImageDestroy($srcImg); }else { //thumbnail width > source width copy source as thumbnail copy($srcImgPath,$thumbnailPath); ImageDestroy($srcImg); } return $thumbnailPath; }
音频文件时长的获得
php中获得音频时长的方法有很多,但是多数只能处理部分音频文件,先给大家介绍一种较为常用以及简洁的插件ID3,下载地址:http://www.getid3.org/获得详情
基本的使用方法:
$getID3 = new getID3; $audioInfo = $getID3->analyze($audioServPath); $duration = $audioInfo['playtime_seconds']; //获得音频文件的时长
视频文件缩略图的获取
在php中获取视频文件某一时刻的画面的缩略图,php暂时没有相关函数来处理视频并获取其相应信息,但是在linux下可通过其他方式来获得,比如ffmpeg,这是一款强大的视频处理软件可根据某一时刻来获得视频的缩略图。然后使用php的exec命令调用ffmpeg命令来获得视频的缩略图。
具体实现样例如下所示:
if(function_exists(exec)) exec("ffmpeg -i " . $sourcePath . " -y -f mjpeg -ss 3 -t 0.001 -s 120x90 ". $videoThumbnail);
其中:$sourcePath 源视频地址 $videoThumbnail 目标生成的缩略图地址