Второй аргумент функции copy() не может быть каталогом

Кто-нибудь знает, почему это:

<?PHP
$title = trim($_POST['title']);
$description = trim($_POST['description']);

// Array of allowed image file formats 
$allowedExtensions = array('jpeg', 'jpg', 'jfif', 'png', 'gif', 'bmp');

foreach ($_FILES as $file) {
  if ($file['tmp_name'] > '') {
    if (!in_array(end(explode(".",
            strtolower($file['name']))),
            $allowedExtensions)) {
      echo '<div class="error">Invalid file type.</div>';
    }
  }
}

if (strlen($title) < 3)
  echo '<div class="error">Too short title</div>';
else if (strlen($description) > 70)
  echo '<div class="error">Too long desccription.</div>';

else {
  move_uploaded_file($_FILES['userfile']['tmp_name'], 'c:\wamp\www\uploads\images/');
}

дает:

Warning: move_uploaded_file() [function.move-uploaded-file]: второй аргумент функции copy() не может быть каталогом в C:\wamp\www\upload.php в строке 41
Warning: move_uploaded_file() [function.move-uploaded-file]: Невозможно переместить 'C:\wamp\tmp\php1AB.tmp' в 'c:\wamp\www\uploads\images/' в C:\wamp\www\upload.php в строке 41

Ответ 1

Это потому, что вы перемещаете файл, и он думает, что вы пытаетесь переименовать этот файл во второй параметр (в этом случае директор).

это должно быть:

move_uploaded_file($_FILES['userfile']['tmp_name'], 'c:/wamp/www/uploads/images/'.$file['name']);

Ответ 2

Вы указываете, чтобы переместить файл в каталог; ни PHP move_uploaded_file ни его copy не так умны, как копия оболочки - вы должны указать имя файла, а не каталог, для назначения.

Таким образом, одним простым решением было бы взять basename имя исходного файла и добавить его в каталог назначения.

Ответ 3

Похоже, что второй аргумент move_uploaded_file должен быть полным именем файла, а не только именем каталога. Кроме того, возможно, только проблема стиля, но вы должны использовать согласованные сокращения в 'c:\wamp\www\uploads\images/'

Ответ 4

Потому что PHP не является оболочкой. Вы пытаетесь скопировать файл в каталог c:\wamp\www\uploads\images, но PHP не знает, что вы имеете в виду, что при выполнении (внутри функции move_uploaded_file):

copy($_FILES['userfile']['tmp_name'], 'c:\wamp\www\uploads\images/');

Эта команда сообщает ему переименовать файл в c:\wamp\www\uploads\images/, который он не может сделать, потому что это имя существующего каталога.

Вместо этого сделайте следующее:

  move_uploaded_file($_FILES['userfile']['tmp_name'], 
    'c:\wamp\www\uploads\images/' . basename($_FILES['userfile']['tmp_name']));

Ответ 5

если вы хотите просто скопировать файл в два разных Dir, попробуйте следующее:

if (move_uploaded_file($_FILES['photo']['tmp_name'], $target.$pic1))
{
  copy("C:/Program Files (x86)/EasyPHP-5.3.9/www/.../images/".$pic1, "C:/Program Files (x86)/EasyPHP-5.3.9/www/.../images/thumbs/".$pic1)
}

Вы должны написать полный путь "C:/..."

Ответ 6

Попробуйте добавить расширение к файлу имен.

$filename = $_FILES['userfile']['tmp_name'].".jpg";

Ответ 7

Это будет как ниже в phalcon 3.42

if ($this->request->hasFiles() == true) {
        // Print the real file names and sizes
        foreach ($this->request->getUploadedFiles() as $file) {

            //Print file details
            echo $file->getName(), " ", $file->getSize(), "\n";

            //Move the file into the application
            $file->moveTo($this->config->application->uploadsDir.$file->getName());
        }
    }