Comments 15
Задача стояла просто загружать файлы, делая их доступными по http, без привязки к нодам?
PS Приятный комментированный код! Но не хватает до ката внятной формулировки цели, а после — чайниковых пояснений, какие куски кода куда пишутся.
PS Приятный комментированный код! Но не хватает до ката внятной формулировки цели, а после — чайниковых пояснений, какие куски кода куда пишутся.
//папка, куда будет загружаться файл
$dir = variable_get('file_directory_path', 'files') . '/headers';
Должно быть
$dir = file_directory_path() . '/headers';
А вобще — то же самое можно было бы более гибко реализовать через ноды и вьюхи — можно было бы без особых проблем накладывать на изображения пресеты imagecache и прочие полезные штуки.
Пару комментариев
1. FILE_CREATE_DIRECTORY. file_check_directory($dir, 1) — не совсем понятно. file_check_directory($dir, FILE_CREATE_DIRECTORY) — понятнее.
2. После аплоада файла и успешной валидации, нужно обязательно сделать $file->status = FILE_STATUS_PERMANENT; т.к. после запуска крона файл удалится. Ф-я file_save_upload() ставит статус файлу — FILE_STATUS_TEMPORARY по умолчанию.
1. FILE_CREATE_DIRECTORY. file_check_directory($dir, 1) — не совсем понятно. file_check_directory($dir, FILE_CREATE_DIRECTORY) — понятнее.
2. После аплоада файла и успешной валидации, нужно обязательно сделать $file->status = FILE_STATUS_PERMANENT; т.к. после запуска крона файл удалится. Ф-я file_save_upload() ставит статус файлу — FILE_STATUS_TEMPORARY по умолчанию.
Если Вы хотели объяснить изпользование form API для загрузки файлов, то можно было бы ограничиться куда меньшим количеством кода.
Там ведь хитрости совсем мало.
1. Делаете стандартную форму, так чтобы в ней был элемент типа «file» api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#file
2. Обязательно укажите для формы $form['#attributes'] = array('enctype' => «multipart/form-data»)
кстати это написано по ссылке выше прям во второй строчке
3. Валидатором проверяете, что это картинка, еще можно проверить максимально допустимый размер.
У Вас, кстати, идет проверка по расширению. Я бы советовал проверять по типу mime. Обходите массив foreach($_FILES as $file) и проверяете $file['type']['название_поля']
там же можно проверить размер $file['size']['название_поля']
4. Сохраняете файл в сабмит-функции.
я использовал: move_uploaded_file($file['tmp_name']['название_поля'], "/путь/имя.картинки";
Кстати и проверку и сохранение я делал прямо в сабмите прямо в обходе массива foreach($_FILES as $file)
Просто когда так много кода, то достаточно сложно вычленить основную мысль.
Там ведь хитрости совсем мало.
1. Делаете стандартную форму, так чтобы в ней был элемент типа «file» api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#file
2. Обязательно укажите для формы $form['#attributes'] = array('enctype' => «multipart/form-data»)
кстати это написано по ссылке выше прям во второй строчке
3. Валидатором проверяете, что это картинка, еще можно проверить максимально допустимый размер.
У Вас, кстати, идет проверка по расширению. Я бы советовал проверять по типу mime. Обходите массив foreach($_FILES as $file) и проверяете $file['type']['название_поля']
там же можно проверить размер $file['size']['название_поля']
4. Сохраняете файл в сабмит-функции.
я использовал: move_uploaded_file($file['tmp_name']['название_поля'], "/путь/имя.картинки";
Кстати и проверку и сохранение я делал прямо в сабмите прямо в обходе массива foreach($_FILES as $file)
Просто когда так много кода, то достаточно сложно вычленить основную мысль.
В пух и прах :)
Только foreach($_FILES as $file) — лучше ограничить.
Только foreach($_FILES as $file) — лучше ограничить.
3. Drupal имеет специальние функции валидации файлов -> file_validate_extensions, file_validate_image_resolution, file_validate_is_image, file_validate_name_length, file_validate_size — покрывают 98% нужных проверок.
4. Для того чтобы Drupal правильно сохранил fileId нужно использовать Drupal функцию file_save_upload (как автор). В друпале не принято напрямую использовать $_FILES (как и $_POST впрочем). И не забить file_set_status.
А вот где лутше сохранять файл в валидаторе или в сабмите не всегда так ясно. Например если сохранять в сабмите, то, когда есть ошибка при валидации другого поля пользователю прийдеться аплоадить файл 2ий раз. Хотя если на форме только одно поле з файлом то нужно сохранять в сабмите.
4. Для того чтобы Drupal правильно сохранил fileId нужно использовать Drupal функцию file_save_upload (как автор). В друпале не принято напрямую использовать $_FILES (как и $_POST впрочем). И не забить file_set_status.
А вот где лутше сохранять файл в валидаторе или в сабмите не всегда так ясно. Например если сохранять в сабмите, то, когда есть ошибка при валидации другого поля пользователю прийдеться аплоадить файл 2ий раз. Хотя если на форме только одно поле з файлом то нужно сохранять в сабмите.
Спасибо за статью. Как раз сейчас одному заказчику требуется из обычного проигрывателя на сайте, сделать плеер с плейлистом и этот туториал отлично подойдет для бэк-енда.
а валидируется ли $images_del->fid встроенным валидатором, чтобы случаем не тот файлик удалить?
Sign up to leave a comment.
Загрузка файлов через Form API