#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!';
}
}
}
}
?>