最近和同学在做一个App,自己负责整个服务器端的代码。
之前做过的web项目(网页开发)中,也遇到过多图片上传的问题,当时的解决方案是将上传图片使用数组传递,根据需要通过js动态添加上传文件的个数,php端用$_FILES获得上传的文件数组,按照约定的数组名称循环遍历即可。
实现方式是:
<input type="file" name="upfile[]"/>
实现动态添加的js代码也非常简单
function add() {
var input = document.createElement('input');
input.type = 'file';
input.name = 'upfile[]';
fileDiv.appendChild(input);
}
图1.实现网页多文件(图片)上传的demo
而Android客户端虽然可以通过模拟Http表单发送post请求上传一个文件对象,但是并不能很好地支持文件数组的上传,只能多个传入不同名的文件对象,在文件数和名都不能确定的情况下,之前的方式显然无法满足现在的需求。
自己在一开始也是从网上各种找资源,也去查看一些参考书籍,发现遇到相似问题的确实不少,但是给出的方案往往不能很好地解决问题,实际项目开发中遇到的问题教程中也不可能面面俱到。后来转而从$_FILES本身入手,比较两种方式收到的结果,通过一个简单的输出对比,很快就明白了其中的原理,问题迎刃而解。
图2.使用upfile[]数组
图3.表单中上传两个name不同的文件对象(此处分别为“up”和“file”),php输出结果
以前我们的做法,是已知上传的name进行遍历的,通过var_dump($_FILES)或者print_r($_FILES)输出观察可以发现,事实上我们收到的依旧是文件的数组,只不过是遍历的方式略有不同而已,以下是项目中文件上传类的代码。
class ImageUpload{
public function getImageUrl(){
return $this -> setImage('upload');
}
public function setUserImage() {
return $this -> setImage('userImage');
}
public function setAchieveImage() {
return $this -> setImage('achieveImage');
}
/**
* 接收来自App(Android)的图片,上传名不同(非数组)
* @Return: 上传的路径,多张图片用英文逗号分隔
*/
private function setImage($file_dir) {
date_default_timezone_set('PRC');
$php_url = dirname($_SERVER['PHP_SELF']) . '/';
$save_url = $php_url . $file_dir . '/';
$php_path = dirname(__FILE__) . '/';
$save_path = $php_path . $file_dir;
$save_path = realpath($save_path) . '/';
$file_all_path = null;
foreach($_FILES as $file_key => $file_value) {
if(!empty($file_value['error']))
continue;
if($file_all_path != null)
$file_all_path .= ",";
$file_name = $file_value['name'];
$temp_arr = explode('.', $file_name);
$file_ext = array_pop($temp_arr);
$file_ext = strtolower(trim($file_ext));
$new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext;
$file_path = $save_path . $new_file_name;
if(move_uploaded_file($file_value['tmp_name'], $file_path)) {
@chmod($file_path, 0644);
$file_url = $save_url . $new_file_name;
$file_all_path .= $file_url;
}
}
return $file_all_path;
}
}
确实以前太依赖于现有的资源,而不重视自己发现问题和解决问题的能力,从一只程序小白渐渐积攒了一些项目经历,仍旧存在很多不足和很许多要完善的地方,这个过程中,感觉自己最重要的收获其实是培养了主动思考的能力,去寻找解决的方案。