我使用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,我不想修改框架代码来解决它。
答案 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移动以前上传的文件。