2017-07-10 9 views
-1

外部ファイルからtmpフォルダにファイルをアップロードしています(ユーザーの投稿要求ではなく)。$ _FILESにそのファイルの情報を入力し、$ _FILES変数を使用するコードに渡します。 しかし、そのコードの中では、is_uploaded_fileチェックを持つmove_uploaded_fileを使用しています。 POSTを使用してアップロードされなかったため、コードによって手動でアップロードされたファイル(ユーザーフォームではなく)がこのチェックに失敗します。その小切手に合格することはできますか?失敗PHPでis_uploaded_fileチェックを渡すには?

コード:$modx-> runProcessor('browser/file/upload'...コードインサイド

//$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 
} 

、失敗した部分があります:

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

それは$ _FILES変数から$ファイルから$ファイルを取得し、私はしたくありませんそれを回避するためにフレームワークコードを修正する。

答えて

1

実際にアップロードされたファイルであることをPHPコアに納得させることはできませんが、アップロードプロセッサの代わりにMODX Media Sourcesを試してみてください。

、メディアソースのインスタンスを取得し、それを初期化し、ファイルの作成にcreateObjectを使用します。

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

move_uploaded_file状態のドキュメント:

この関数は、filenameで指定されたファイルが(それはPHPのHTTP POSTアップロード機構によりアップロードされたことを意味する)有効なアップロードファイルであるかどうかを確認します。ファイルが有効な場合、ファイルはdestinationで指定されたファイル名に移動されます。

ファイルが実際にはPOSTされていないように見えるので、これは不可能です。以前にアップロードしたファイルをrename経由で移動することはできます。

+0

悲しいです..「あなたは、まだ名前の変更を経て、以前にアップロードされたファイルを移動することができます。」 - できません - フレームワークコードを使用する必要があります。なぜならアップロード中に失うことのないイベントを生成するからです – maxpovver

関連する問題