如何将通过Filepicker发出的文件上载请求转换为在PHP中使用简单HTML文件控件发出的类似请求?

如何将通过Filepicker发出的文件上载请求转换为在PHP中使用简单HTML文件控件发出的类似请求?,php,file-upload,filepicker.io,filepicker,input-type-file,Php,File Upload,Filepicker.io,Filepicker,Input Type File,我的表单上有简单的HTML文件控件。它本质上是动态的,意味着用户可以上传一个或多个文件。其HTML格式如下: <input type="file" id="image_book" class="image_book upload" name="image[]" accept="image/*" value=""/> 现在,根据新的要求,我必须使用Filepicker而不是简单的HTML文件控件将文件上载到服务器。但我面临的问题是,考虑到上述数组($\u文件)的内容,已经编写了进一步

我的表单上有简单的HTML文件控件。它本质上是动态的,意味着用户可以上传一个或多个文件。其HTML格式如下:

<input type="file" id="image_book" class="image_book upload" name="image[]" accept="image/*" value=""/>
现在,根据新的要求,我必须使用Filepicker而不是简单的HTML文件控件将文件上载到服务器。但我面临的问题是,考虑到上述数组(
$\u文件
)的内容,已经编写了进一步的代码逻辑和操作

因此,我想将通过Filepicker发出的请求转换为与array
$\u FILES
相同的格式,这样就不需要对已经编写的代码逻辑和操作进行任何更改

让我更清楚地向您解释这个场景,如果用户通过Filepicker从Google Drive选择一个或多个图像文件并提交表单,请求将包含Filepicker生成的图像的URL和文件名


我想使用此数据并形成上述数组(
$\u FILES
)的数组。

假设您使用的是PHP 5.2.1或更高版本,并且可以在
copy()
file\u get\u contents()
中使用HTTPS流包装器,则此函数应该是您所需要的全部:

函数getFilePickerFile($tokens)
{
$files=array('name'=>array(),
'type'=>array(),
'tmp_name'=>array(),
'错误'=>array(),
'size'=>array());
$tmpdir=sys\u get\u temp\u dir();
foreach($tokens作为$token)
{
$files['tmp_name'][]=$tmp=$tmpdir./php'.$token;
$files['error'][]=复制('https://www.filepicker.io/api/file/“.$token,$tmp)?上传错误确定:上传错误否文件;
$files['size'][]=filesize($tmp);
$meta=json\u解码(文件\u获取\u内容('https://www.filepicker.io/api/file/“.$token.”/metadata?filename=true&mimetype=true'),true);
$files['name'][=$meta['filename'];
$files['type'][=$meta['mimetype'];
}
返回数组('image'=>$files);
}
此函数将令牌数组(例如
hFHUCB3iTxyMzseuWOgG
)作为参数。
你可以这样称呼它

getFilepickerFiles(数组('hFHUCB3iTxyMzseuWOgG');
我不知道具体是什么文件选择器传递到您的服务器,但如果它是一个完整的文件URL,如

https://www.filepicker.io/api/file/hFHUCB3iTxyMzseuWOgG
然后您可以像这样提取令牌:

$tokens=array();
foreach($url作为$url)
{
$matches=array();
预赛^https://www\\.filepicker\\.io/api/file/([^/]*)/?',$url,$matches);
$tokens[]=$matches[1];
}
//将$tokens传递给getFilepickerFiles()
您还可以将其直接放入
getFilepickerFiles()
中,使其采用一个文件URL数组:

函数getFilePickerFile($URL) { $files=array('name'=>array(), 'type'=>array(), 'tmp_name'=>array(), '错误'=>array(), 'size'=>array()); $tmpdir=sys\u get\u temp\u dir(); foreach($url作为$url) { $matches=array(); 预赛^https://www\\.filepicker\\.io/api/file/([^/]*)/?',$url,$matches); $token=$matches[1]; $files['tmp_name'][]=$tmp=$tmpdir./php'.$token; $files['error'][]=复制('https://www.filepicker.io/api/file/“.$token,$tmp)?上传错误确定:上传错误否文件; $files['size'][]=filesize($tmp); $meta=json\u解码(文件\u获取\u内容('https://www.filepicker.io/api/file/“.$token.”/metadata?filename=true&mimetype=true'),true); $files['name'][=$meta['filename']; $files['type'][=$meta['mimetype']; } 返回数组('image'=>$files); }
解释 我觉得上面的代码相当简单,但下面是
getFilepickerFiles()
的工作原理(您应该在阅读之前阅读):

$files=array('name'=>array(),
'type'=>array(),
'tmp_name'=>array(),
'错误'=>array(),
'size'=>array());
$文件
初始化为一个类似
$\u files
的数组,该数组不包含任何文件

$tmpdir=sys\u get\u temp\u dir();
获取存储临时文件的目录,因为我们要将文件下载到那里(此函数需要PHP5.2.1或更高版本)

foreach($url作为$url)
foreach
的作用应该很清楚

$files['tmp\u name'][]=$tmp=$tmpdir./php.$token;
按照
$\u FILES
的模式构建我们的临时文件路径(即临时文件文件夹的路径、字符串“php”和一些随机字符)。
我们将该名称指定给
$tmp
(便于以后使用),并将其添加到文件路径列表中

$files['error'][=(int)(!copy('https://www.filepicker.io/api/file/“.$token,$tmp”);
尝试使用URL作为源的
copy()
将文件下载到
$tmp

copy()
返回的值在成功时为
TRUE
,在失败时为
FALSE

$\u文件
中存在的错误值是成功时的
上传错误\u确定
和其他任何值(如果失败,我将使用
上传错误\u否\u文件

因此,为了分配一个有意义的错误值,如果
copy()
返回
TRUE
,我们使用三元运算符将
UPLOAD\u ERR\u OK
添加到错误代码列表中,否则
UPLOAD\u ERR\u NO\u FILE

$files['size'][]=filesize($tmp);
查询文件大小并将其添加到文件大小列表中

$meta=json\u解码(文件获取内容('https://www.filepicker.io/api/file/“.$token.”/metadata?filename=true&mimetype=tru
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
                )

        )

)