Jump to content

Загрузка файлов

Чтобы разрешить загрузку файлов в вашем коде, вы должны использовать класс \IPS\Helpers\Form\Upload внутри Помощника формы.

Администратор имеет возможность контролировать как хранить различные типы файлов - из-за этого использование поля Upload немного сложнее, чем большинство других типов форм.

Расширение FileStorage

Вы должны создать расширение FileStorage в своем приложении, которое в основном используется для предоставления обратных вызовов для поиска файлов, загружаемых вашим полем.

Для начала создайте файл расширения FileStorage с помощью Центра разработчика для вашего приложения. Файл скелета будет создан в директории applications/app/extensions/core/FileStorage с кодом примером. Вам нужно будет предоставить код для всех методов.

Например, если вы сохраняете каждый файл в строке в таблице базы данных, код может выглядеть примерно так:

<?php

namespace IPS\forums\extensions\core\FileStorage;

class _Key
{
	/**
	 * Count stored files
	 *
	 * @return	int
	 */
	public function count()
	{
		return \IPS\Settings::i()->setting_key ? 1 : 0;
	}
	
	/**
	 * Move stored files
	 *
	 * @param	int			$offset					This will be sent starting with 0, increasing to get all files stored by this extension
	 * @param	int			$storageConfiguration	New storage configuration ID
	 * @param	int|NULL	$oldConfiguration		Old storage configuration ID
	 * @throws	\Underflowexception				When file record doesn't exist. Indicating there are no more files to move
	 * @return	void
	 */
	public function move( $offset, $storageConfiguration, $oldConfiguration=NULL )
	{
		$thing = \IPS\Db::i()->select( '*', 'my_table', 'image IS NOT NULL', 'id', array( $offset, 1 ) )->first();
		\IPS\Db::i()->update( 'my_table', array( 'image' => (string) \IPS\File::get( $oldConfiguration ?: 'app_Key', $thing['image'] )->move( $storageConfiguration ) ), array( 'id=?', $thing['id'] ) );
	}

	/**
	 * Check if a file is valid
	 *
	 * @param	\IPS\Http\Url	$file		The file to check
	 * @return	bool
	 */
	public function isValidFile( $file )
	{
		try
		{
			\IPS\Db::i()->select( 'id', 'my_table', array( 'image=?', $file ) )->first();
			return TRUE;
		}
		catch ( \UnderflowException $e )
		{
			return FALSE;
		}
	}

	/**
	 * Delete all stored files
	 *
	 * @return	void
	 */
	public function delete()
	{
		foreach( \IPS\Db::i()->select( '*', 'my_table', "image IS NOT NULL" ) as $forum )
		{
			try
			{
				\IPS\File::get( 'app_Key', $forum['image'] )->delete();
			}
			catch( \Exception $e ){}
		}
	}
}

Однако, соответствующий код для использования будет зависеть от природы того, как хранятся файлы, созданные вашим контентом.

Создание элемента формы

При создании элемента вы должны указать параметр $options, указав только что созданное расширение. Например, код для создания вашего элемента будет похож на этот:

$form->add( new \IPS\Helpers\Form\Upload( 'my_upload_field', NULL, TRUE, array( 'storageExtension' => 'app_Key' ) ) );

Доступны дополнительные опции, позволяющие загружать несколько файлов, ограничивать разрешенные расширения, максимальный размер файла и многое другое. Смотрите исходный код класса для всех доступных опций.

Обработка данных

Возвращаемое значение будет объектом класса \IPS\File (или массив объектов \IPS\File, если поле допускает загрузку нескольких файлов). Вам не нужно ничего делать с самим файлом, поскольку он уже был сохранен в соответствии с предпочтениями администратора. Тем не менее, вам нужно сохранить URL-адрес (который вы можете получить путём преобразования объекта \IPS\File в строку), поскольку это то, что вам понадобится получить и манипулировать файлом позже, и использовать внутри созданного вами расширения ранее. Например, ваш код может выглядеть так:

$form = new \IPS\Helpers\Form;
$form->add( new \IPS\Helpers\Form\Upload( 'my_upload_field', NULL, TRUE, array( 'storageExtension' => 'app_Key' ) ) );

if ( $values = $form->values() )
{
	\IPS\Db::i()->insert( 'my_table', array( 'image' => (string) $values['my_upload_field'] ) );
}

Манипулирование файлом позже

Чтобы вернуть объект \IPS\File позже, вы должны вызвать:

$file = \IPS\File::get( 'app_Key', $url );

Первый параметр является вашим расширением, а второй - URL-адресом, который вы получили при сохранении формы. Затем вы можете использовать этот объект, чтобы получить содержимое файла, удалить его и т.д. Смотрите PhpDocs в \IPS\File для получения дополнительной информации о том, что вы можете делать с файлами.

Если это файл изображения, вы также можете создать объект \IPS\Image для изменения размера, добавления водяного знака и т.д. Для этого вы должны вызывать:

$image = \IPS\Image::create( $file->contents() );

Смотрите PhpDocs в \IPS\Image для получения дополнительной информации о том, что вы можете делать с изображениями.




Messenger

    ×
    ×
    • Create New...

    Important Information

    By using our site you agree to our Privacy Policy