如何将通过Filepicker进行的文件上传请求转换为使用PHP中简单的H
我在我的表单上有简单的
HTML文件控制.它本质上是动态的,意味着用户可以上传一个或多个文件.其HTML如下:
<input type="file" id="image_book" class="image_book upload" name="image[]" accept="image/*" value=""/> 如果我使用上述HTML文件控件上传两个图像,并提交我在$_FILES数组(print_r($_ FILES)的输出)中获得的表单): Array ( [image] => Array ( [name] => Array ( [0] => Aurbd-b3582991-large.jpg [1] => BL_Miller_GD_Square_KV_300dpi_A2.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => /tmp/phpSt8CJJ [1] => /tmp/phpibFjR2 ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 519179 [1] => 86901 ) ) ) 现在根据新的要求,我必须使用Filepicker而不是简单的HTML文件控制来将文件上传到服务器.但是我面临的问题是,考虑到上述数组($_ FILES)内容,已经编写了进一步的代码逻辑和操作. 所以,我想将通过Filepicker进行的请求转换为与数组$_FILES相同的格式,这样就不需要对已经编写的代码逻辑和操作做出任何改变. 如果用户通过Filepicker从Google Drive中选择一个或多个映像文件并提交表单,请让我向您解释一下场景,该请求将包含Filepicker生成的图像和文件名的URL. 我想使用这个数据并形成数组,如上面的数组($_ FILES).
假设您正在使用PHP 5.2.1或更高版本,并且可以在copy()和file_get_contents()中使用HTTPS流包装器,则此功能应该是您需要的:
function getFilepickerFiles($tokens) { $files = array('name' => array(),'type' => array(),'tmp_name' => array(),'error' => array(),'size' => array()); $tmpdir = sys_get_temp_dir(); foreach($tokens as $token) { $files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; $files['error'][] = copy('https://www.filepicker.io/api/file/'.$token,$tmp) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE; $files['size'][] = filesize($tmp); $meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'),TRUE); $files['name'][] = $meta['filename']; $files['type'][] = $meta['mimetype']; } return array('image' => $files); } 此函数使用一系列令牌(如hFHUCB3iTxyMzseuWOgG)作为参数. getFilepickerFiles(array('hFHUCB3iTxyMzseuWOgG')); 我不知道什么Filepicker传递到您的服务器,但如果它是一个完整的文件URL,如 https://www.filepicker.io/api/file/hFHUCB3iTxyMzseuWOgG 那么你可以这样提取令牌: $tokens = array(); foreach($urls as $url) { $matches = array(); preg_match('# ^https://www.filepicker.io/api/file/([^/]*)/?',$url,$matches); $tokens[] = $matches[1]; } // Pass $tokens to getFilepickerFiles() 您也可以将该权利放在getFilepickerFiles()中,以使其成为文件URL数组: function getFilepickerFiles($urls) { $files = array('name' => array(),'size' => array()); $tmpdir = sys_get_temp_dir(); foreach($urls as $url) { $matches = array(); preg_match('# ^https://www.filepicker.io/api/file/([^/]*)/?',$matches); $token = $matches[1]; $files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; $files['error'][] = copy('https://www.filepicker.io/api/file/'.$token,TRUE); $files['name'][] = $meta['filename']; $files['type'][] = $meta['mimetype']; } return array('image' => $files); } 说明 我觉得上面的代码很简单,但是这里是getFilepickerFiles()的工作原理(在阅读之前你应该已经读过Rest API documentation): $files = array('name' => array(),'size' => array()); 将$文件初始化为像$_FILES(不包含任何文件)的数组. $tmpdir = sys_get_temp_dir(); 获取存储临时文件的目录,因为我们要将文件下载到那里(此函数需要PHP 5.2.1或更高版本). foreach($urls as $url) 什么foreach应该清楚. $files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; 构建我们的临时文件路径,遵循$_FILES的模式(即临时文件夹的路径,字符串“php”和一些随机字符). $files['error'][] = (int)(!copy('https://www.filepicker.io/api/file/'.$token,$tmp)); 尝试使用带URL的copy()作为源文件将文件下载到$tmp. $files['size'][] = filesize($tmp); 查询文件大小并将其添加到文件大小列表中. $meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'),TRUE); 通过使用URL作为file_get_contents()的参数来获取文件元数据,该文件应该使用json_decode(/*…*/,TRUE)将我们解码的JSON数组返回到关联数组中. $files['name'][] = $meta['filename']; $files['type'][] = $meta['mimetype']; 将来自刚解码的JSON数组的值filename和mimetype分别添加到文件名和MIME类型的列表中. return array('image' => $files); 返回一个数组,图像键指向我们创建的文件数组. 我们完成了 演示? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |