如何将通过Filepicker进行的文件上传请求转换为使用PHP中简单的HTML文件控制的类似请求?

前端之家收集整理的这篇文章主要介绍了如何将通过Filepicker进行的文件上传请求转换为使用PHP中简单的HTML文件控制的类似请求?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的表单上有简单的 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”和一些随机字符).
我们分配给$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);

返回一个数组,图像键指向我们创建的文件数组.

我们完成了

演示?

猜你在找的PHP相关文章