之前曾经写过一个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:\xampp\tmp\phpB784.tmp"
[1]=>
string(24) "C:\xampp\tmp\phpB785.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:\xampp\tmp\phpB784.tmp
[error] => 0
[size] => 6584
)
[1] => Array
(
[name] => com_student_aynu.png
[type] => image/png
[tmp_name] => C:\xampp\tmp\phpB785.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;
}
后面循环上传就可以了。