PHP服务端项目开发经历——解决Android客户端中多图片上传的问题

最近和同学在做一个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;
		}
	}
 确实以前太依赖于现有的资源,而不重视自己发现问题和解决问题的能力,从一只程序小白渐渐积攒了一些项目经历,仍旧存在很多不足和很许多要完善的地方,这个过程中,感觉自己最重要的收获其实是培养了主动思考的能力,去寻找解决的方案。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值