如何通过php中的is_uploaded_file检查?

时间:2017-07-10 14:32:38

标签: php file-upload modx

我使用php代码(不是来自用户发布请求)从外部文件上传文件到tmp文件夹,然后用$ _FILES填充该文件的信息并将其传递给使用$ _FILES变量的代码。 但是在该代码中,它使用了move_uploaded_file,它具有is_uploaded_file检查。由代码手动上传的文件(不是通过用户表单发布)未通过此检查,因为它未使用POST上传。我可以通过检查吗?

失败的代码:

//$url contains url of image from another site
function upload_from_url($url)
{
    global $modx;
    // we load temporary file to /tmp and then add it to $_FILES
    $img = '/tmp/'.uniqid("", true); // no extension here since we can't trust it
    $res = file_put_contents($img, file_get_contents($url)); // UPLOAD is made here, it works
    $mimeType = mime_content_type($img);
    $allowedMimeTypes = ["image/jpeg","image/gif","image/png"];
    if (!in_array($mimeType, $allowedMimeTypes))
    {
        logError("!!!ATTENTION!!! got file $img with forbidden mime type $mimeType");
        throw new RuntimeException("Forbidden file mime type!"); 
        die; // just to be sure; shouldn't get here
    }
    $_FILES['file']['name'] = uniqid("img", true)."."
        .(explode("/", $mimeType)[1]); // get jpg part of image/jpg
    $_FILES['file']['type'] = $mimeType;
    $_FILES['file']['tmp_name'] = $img;
    $_FILES['file']['error'] = 0; // = UPLOAD_ERR_OK
    $_FILES['file']['size'] = filesize($img);
    $response = $modx-> runProcessor('browser/file/upload', ['path' => 'assets/images']); // <= here it fails
}

$modx-> runProcessor('browser/file/upload'...内部代码中,有部分失败:

    if (!move_uploaded_file($file['tmp_name'],$newPath)) {
        $this->addError('path',$this->xpdo->lexicon('file_err_upload'));
        continue;
    }

它从$ _FILES变量的$ files中获取$ file,我不想修改框架代码来解决它。

2 个答案:

答案 0 :(得分:1)

我不认为您能够说服php核心它确实是一个上传的文件,但您可以尝试使用MODX Media Sources而不是上传处理器。

获取媒体源的实例,对其进行初始化,然后使用createObject创建文件:

$source = $modx->getObject('sources.modMediaSource', $idOfSource);
if ($source && $source->initialize()) { 
    $source->createObject($objectPath, $name, $content)
}

答案 1 :(得分:0)

move_uploaded_file州的文档:

  

此函数检查以确保filename指定的文件是有效的上载文件(意味着它是通过PHP的HTTP POST上载机制上传的)。如果文件有效,它将被移动到目的地给出的文件名。

所以看起来如果文件实际上没有POST,这是不可能的。您仍然可以通过rename移动以前上传的文件。