<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).
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());
$tmpdir = sys_get_temp_dir();
获取存储临时文件的目录,因为我们要将文件下载到那里(此函数需要PHP 5.2.1或更高版本).
foreach($urls as $url)
什么foreach应该清楚.
$files['tmp_name'][] = $tmp = $tmpdir.'/PHP'.$token;
构建我们的临时文件路径,遵循$_FILES的模式(即临时文件夹的路径,字符串“PHP”和一些随机字符).
我们分配给$tmp的名称(以便稍后使用),我们将其添加到文件路径列表中.
$files['error'][] = (int)(!copy('https://www.filepicker.io/api/file/'.$token,$tmp));
尝试使用带URL的copy()作为源文件将文件下载到$tmp.
copy()返回的值在成功时为TRUE,失败时为FALSE.
$_FILES中存在的错误值在成功时为UPLOAD_ERR_OK,否则为其他值(source,出现故障时我将使用UPLOAD_ERR_NO_FILE).
因此,为了分配一个有意义的错误值,如果copy()返回TRUE,则使用三元运算符将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);
通过使用URL作为file_get_contents()的参数来获取文件元数据,该文件应该使用json_decode(/*…*/,TRUE)将我们解码的JSON数组返回到关联数组中.
由于我们在URL的末尾附加了& filename = true& mimetype = true,所以我们只会得到filename和mimetype的值 – 我们不需要其余的.
我们分配给$Meta的解码数组;
$files['name'][] = $Meta['filename']; $files['type'][] = $Meta['mimetype'];
将来自刚解码的JSON数组的值filename和mimetype分别添加到文件名和MIME类型的列表中.
return array('image' => $files);
返回一个数组,图像键指向我们创建的文件数组.
我们完成了
演示?