之前曾经写过一个php接收图片的文章,但是感觉很乱,不规律。最近看了ThinkPhp框架,ThinkPhp的MVC结构十分清晰,其中还封装了文件上传类,数据库相关东西,十分好用。于是在毕设中决定采用ThinkPhp来写接口。
一、单文件上传。
客户端代码基本一致,只修改了服务端,采用了ThinkPhp接收。
//客户端的key为user_head if ($_FILES['user_head']['error'] === 0) { // 这是thinkPhp中Upload.class.php中的一些参数配置,其中都有注释,根据自己需求自己配置。 $cfg = array( 'rootPath' => './Public/user_head/', //保存根路径 'autoSub' => false, //自动子目录保存文件 'saveName' => $_FILES['user_head']['name'], //文件名 'saveExt' => 'jpg' //文件保存后缀,空则使用原后缀 ); // 设置附件的存储位置 $upload = new Upload($cfg); // 上传文件 $z = $upload->uploadOne($_FILES['user_head']); if (! $z) { // 上传错误提示错误信息 echo $this->error($upload->getError()); } // 图片路径 $img_url = "IP地址" . $upload->rootPath . $z['savename']; //后续可以将url存入数据库
二、多文件上传
多文件上传采用循环遍历,唯一不同的是客户端采用“一key多value”上传。
客户端的key为”images[]”;(上传两张图片)
服务端接收 $files = $_FILES[‘images’];
通过var_dump打印结果发现为
array(5) { ["name"]=> array(2) { [0]=> string(31) "com_eg_android_AlipayGphone.png" [1]=> string(20) "com_student_aynu.png" } ["type"]=> array(2) { [0]=> string(9) "image/png" [1]=> string(9) "image/png" } ["tmp_name"]=> array(2) { [0]=> string(24) "C:xampptmpphpB784.tmp" [1]=> string(24) "C:xampptmpphpB785.tmp" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(0) } ["size"]=> array(2) { [0]=> int(6584) [1]=> int(34205) } }
这并不是我们想要的格式
我们想要的格式为:
Array ( [0] => Array ( [name] => com_eg_android_AlipayGphone.png [type] => image/png [tmp_name] => C:xampptmpphpB784.tmp [error] => 0 [size] => 6584 ) [1] => Array ( [name] => com_student_aynu.png [type] => image/png [tmp_name] => C:xampptmpphpB785.tmp [error] => 0 [size] => 34205 ) )
其中需要转化一下,转换的代码为(key,value 换一下)
function reArrayFiles($file_post) { $file_ary = array(); $file_count = count($file_post['name']); $file_keys = array_keys($file_post); for ($i = 0; $i < $file_count; $i ++) { foreach ($file_keys as $key) { $file_ary[$i][$key] = $file_post[$key][$i]; } } return $file_ary; }
后面循环上传就可以了。
上传成功
保存入库