Предупреждение ftp_put() имя файла не может быть пустым

#php #file-upload

#php #загрузка файла

Вопрос:

Мне нужно загрузить некоторые видео и аудиофайлы, используя php и ftp. Я использую встроенные в php функции ftp, но у меня возникли некоторые проблемы с ftp_put() функцией. Пока я тестирую код, он будет продолжать выдавать мне ошибку, связанную с именем файла. Как я могу это исправить.

Вот вывод консоли php, когда я пытаюсь загрузить файл:

Warning: ftp_put(): Filename cannot be empty in /Users/uc/Desktop/c/FtpManager.php on line 37

И это $_FILES дамп массива: array(5) { ["name"]=> string(8) "em_1.mp4" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(1) ["size"]=> int(0) }

Код, который я использую для создания прототипа скрипта, следующий:

 <?php 
  /* Upload video */
  public function uploadVideo(array $inputFile){
      if( ftp_chdir( $this->conn, "/cloud.mywebsite.com/" ) ){
        $upload = ftp_put( $this->conn, $inputFile['video_file']['name'], $inputFile['video_file']['name'], FTP_BINARY);
        if( $upload ){
          echo 'File uploaded!';
        }
      }
  }

if(isset($_POST['upload_video'])){
  echo $ftp->uploadVideo($_FILES['video_file']);
}

?>

<form enctype="multipart/form-data" method="POST" action="">
  <input type="file" name="video_file" />
  <input type="submit" name="upload_video">
</form>
  

Комментарии:

1. ["error"]=> int(1) — это означает, что произошла ошибка при загрузке. Значение 1 является UPLOAD_ERR_INI_SIZE ошибкой, что означает «Загруженный файл превышает директиву upload_max_filesize в php.ini».

2. @rickdenhaan Я использую встроенный php-сервер macOS. Я не устанавливал php ini, но видео, которое я использую для тестирования, имеет размер всего 3 МБ. Проблема mai, с которой я столкнулся, связана с ftp_put() функцией

Ответ №1:

Распространенной причиной ошибки является превышение maximum allowed filesize . По крайней мере, проверьте ошибку в $_FILES записи для вашего файла перед попыткой загрузки по FTP

 if ($_FILES['video_file']['error'] != UPLOAD_ERR_OK) {
  // handle the error instead of uploading e.g. give a message to user
}
  

Комментарии:

1. @dwpu пожалуйста, поделитесь выводом print_r($_FILES)

2. Проверьте вопрос, я его уже опубликовал. Массив содержит только информацию об имени файла и ошибку.

3. @dwpu как я вижу, ошибка индекса имеет значение 1, что означает, что у вас ошибка при загрузке файла. пожалуйста, проверьте post_max_size в вашем ini

4. Я переключился с встроенного php-сервера macOS на MAMP, и массив файлов теперь заполнен всей информацией о видео, которое я использую для тестирования кода. Проблема заключается в том, что ftp_put() только сейчас. Вот содержимое $_FILES массива: array(5) { ["name"]=> string(8) "em_1.mp4" ["type"]=> string(9) "video/mp4" ["tmp_name"]=> string(36) "/Applications/MAMP/tmp/php/php8tx1cg" ["error"]=> int(0) ["size"]=> int(3625754) }

5. Странная проблема связана с файловой переменной, которой нет внутри кода, но консоль регистрирует мне эти две ошибки: PHP Notice: Undefined variable: file и PHP Warning: ftp_put(): Filename cannot be empty

Ответ №2:

Спасибо за вашу помощь, и после небольшой отладки кода я нашел решение. Вот рабочий фрагмент кода. Я не смог использовать эту ftp_put() функцию, потому что встроенный php-сервер macOS на моем компьютере не настроен. Я переключился с него на MAMP и решил проблему с размером загружаемого файла. Мне также нужно было установить ftp_pasv() режим на on, чтобы избежать проблем с загруженными файлами.

 <?php 

class ftp{

public function ftpLogin(){
    if( ftp_login($this->conn, $this->user, $this->pwd) ){
      ftp_pasv($this->conn, true);
      echo "Connected to: $this->host !";
    }
}

public function uploadVideo(array $inputFile){
      if( ftp_chdir( $this->conn, "/mysite.subdomain.com/" ) ){
        $upload = ftp_put( $this->conn, $inputFile['name'], $inputFile['tmp_name'], FTP_BINARY);
        if( $upload ){
          echo 'File uploaded!';
        }
      }
}

}

?>