Subir archivos a una carpeta del servidor en toba 3.4

¿Cómo puedo hacer para subir un archivo a una carpeta del servidor y guardar el path relativo de ese archivo como character varying en una tabla de la base de datos?
Y también quiero saber como puedo eliminar ese archivo si elimino el registro en el que está referenciado.
Muchas gracias por su ayuda.

Un saludo, espero que lo comprendas
Falta validar por ajax el tamaño para evitar bloquear la red, si lo necesitas te lo paso
En el editor creas dos campos adicionales a us interfaz
vista_previa ef_fijo, con tildado de estado html
archivo ef_upload

En la base de datos debes tener un campo para guardar el nombre del archivo, en mi caso lo llamo archivo_adjunto

//CODIGO EN EL CI DONDE TIENES EL FORMULARIO
function conf__formulario(toba_ei_formulario $form)
{
$form->ef(‘sol_descripcion’)->set_botonera(‘Full’);
if ($this->dep(‘datos’)->esta_cargada()) {
$datos = $this->dep(‘datos’)->tabla(‘solicitudes’)->get();
if ($datos[‘archivo_adjunto’]) {
$array_directorios[0] = ‘archivos_solicitudes’;
$array_directorios[1] = ‘sistema_’.$datos[‘sol_servicio’];
$directorio = $array_directorios[0].‘/’.$array_directorios[1];
$temp_nombre = ‘/’.$directorio.‘/’.$datos[‘archivo_adjunto’];
$temp_archivo = toba::proyecto()->get_www($temp_nombre);
// "dir ".$temp_archivo;
$datos[‘vista_previa’] = “<a href=‘{$temp_archivo[‘url’]}’ target=‘_blank’>Abrir - “.$datos[‘archivo_adjunto’].””;
$tamanyo = 0;
if(file_exists($temp_archivo[‘path’]))
$tamanyo = round(filesize($temp_archivo[‘path’]) / 1024);
$datos[‘archivo’] = 'tamanyo: ‘.$tamanyo. ’ KB’;
} else {
$datos[‘archivo_adjunto’] = null;
}
toba::memoria()->set_dato_instancia(‘operacion_adjunto’, ‘seleccion’);
return $datos;
//$form->set_datos($this->dep(‘datos’)->tabla(‘solicitudes’)->get());
} else {
toba::memoria()->set_dato_instancia(‘operacion_adjunto’, ‘agregar’);
$this->pantalla()->eliminar_evento(‘eliminar’);
}
}

function evt__formulario__modificacion($datos)
{
	//sincronizar fechas
	
	date_default_timezone_set('America/Bogota');
	$operacion = toba::memoria()->get_dato_instancia('operacion');
	if ($operacion == 'agregar'){
		$datos['sol_fecha_registro'] = date('Y-m-d H:i:s');
	}
	$this->dep('datos')->tabla('solicitudes')->set($datos);
	$this->dep('datos')->tabla('solicitudes')->sincronizar();
	if (is_array($datos['archivo'])) {
		$datos = $this->preparar_descarga ($datos);
	}
	$this->dep('datos')->tabla('solicitudes')->set($datos);
}



function preparar_descarga ($registro)
{
	$error_descarga = navegacion::get_error_descargas ($registro);
	if ($error_descarga) toba::notificacion()->agregar($error_descarga, 'error');
	else {
		$datos_solicitud = $this->dep('datos')->tabla('solicitudes')->get();
		$array_directorios[0] = 'archivos_solicitudes';
		$array_directorios[1] = 'sistema_'.$datos_solicitud['sol_servicio'];
		$registro = navegacion::get_validar_descargas ($registro, $array_directorios);
	}
	return $registro;
}

//CODIGO DE LAS LLAMADAS DE VALIDACION EN MI LIBRERIA

static function set_crear_directorios ($array_directorios) {
$dir_temp = toba::proyecto()->get_www ();
$directorio = $dir_temp[‘path’];
for ($i = 0; $i < count($array_directorios); $i++) {
$directorio .= ‘/’.$array_directorios[$i];
if(!file_exists($directorio)) mkdir ($directorio);
}
return $directorio;
}

static function get_error_descargas ($datos) {
$mensaje = ‘’;
if ($datos[‘archivo’][‘error’]) {
switch ($datos[‘archivo’][‘error’]) {
case 1: $mensaje = (“ERROR: El tamanyo es mayor al definido por la configuracion de PHP.”); break;
case 2: $mensaje = (“ERROR: El tamanyoo es mayor al definido en el formulario HTML.”); break;
case 3: $mensaje = (“ERROR: El archivo solo fue parcialmente subido.”); break;
case 4: $mensaje = (“ERROR: Ningun archivo fue subido.”); break;
case 6: $mensaje = (“ERROR: No existe un directorio para archivos temporales.”); break;
case 7: $mensaje = (“ERROR: Fallo la escritura en disco del archivo.”); break;
case 8: $mensaje = (“ERROR: Alguna extension de PHP interrumpio la subida del archivo.”);
default: $mensaje = “ERROR: Fallo al tratar de subir el Archivo, contactar el Administrador”;
}
}else $mensaje = navegacion::get_validar_tamanyo ($datos);
return $mensaje;
}

 static function get_validar_tamanyo ($datos)    {
    $mensaje = '';
    $requerimientos  = navegacion::get_requerimientos();
    $maxima_descarga = $requerimientos[0]['reqsis_maxima_descarga'];
    if (! $maxima_descarga) $maxima_descarga = 5;
    $tamanyo_maximo  = $maxima_descarga * (1024 * 1024);
    if ($datos['archivo']['size'] > $tamanyo_maximo) {
      $mensaje = "ERROR: El Tamanyo del Archivo supera el Maximo de ".$tamanyo_maximo." Permitido en el Servidor";
    }
    return $mensaje;
 }

 static function get_validar_descargas ($datos, $array_directorios)    {
    $aux_datos = $datos;
    $fp = fopen($datos['archivo']['tmp_name'], 'rb');
    //$datos['nombre']     = str_replace(' ', '_', $datos['archivo']['name']);
    $datos['archivo_adjunto']   = $datos['archivo']['name'];
    //moverlo al path propio
    $ruta = navegacion::set_crear_directorios ($array_directorios);
    $archivo = $ruta.'/'.$datos['archivo_adjunto'];
    if(file_exists($archivo)) {
      $datos['archivo_adjunto'] = rand (1, 1000).'_'.$datos['archivo_adjunto'];
    }
    $ruta .= '/'.$datos['archivo_adjunto'];
    $datos['ruta'] = $ruta;
    if (move_uploaded_file($datos['archivo']['tmp_name'], $ruta)) {
       toba::notificacion()->agregar("<center>El archivo se subio exitosamente al servidor.",'info');
       return $datos;
    } else {
       toba::notificacion()->agregar("<center>ERROR: El archivo no se logro subir con exito.",'error');
    }
    return $aux_datos;
 }

Hola @jorozco, gracias por la pronta respuesta, por favor decime en que clase va cada método por favor y en que carpeta pongo la carpeta para subir los archivos.
Aclaro que yo creé un proyecto que no es de producción así que tengo el toba_editor y el proyecto se llama ciftoba, así que como ya deben saber está en la carpeta /proyectos/ciftoba.
Ya vi que el método conf__formulario está en el ci.

En el método preparar_descargas, se arman los directorios, como te lo envié el sistema crea el directorio en la carpeta navegable www/archivos_solicitudes/nombre_archivo.*
navegacion:: es una libreria personalizada(dentro van lo que se llaman en navegacion:: //CODIGO DE LAS LLAMADAS DE VALIDACION EN MI LIBRERIA), puedes crear tu propia libreria o tener todos los métodos en el mismo CI y llamarlos ($this->metodo()), pero la idea es reutilizar el código

$array_directorios[0] = ‘archivos_solicitudes’; //este es el nombre de la carpeta
$array_directorios[1] = ‘sistema_’.$datos[‘sol_servicio’]; //este el nombre del archivo
$directorio = $array_directorios[0].‘/’.$array_directorios[1];
$temp_nombre = ‘/’.$directorio.‘/’.$datos[‘archivo_adjunto’];
$temp_archivo = toba::proyecto()->get_www($temp_nombre)

En tu caso por ejemplo se creará el directorio //proyectos/ciftoba/www/archivos_solicitudes
Es cuestión de ajustar tu propia nomenclatura.

Muchas gracias, dejame aclararte que el tipo de archivos que quiero subir es de imagen y quiero mostrar esa imagen en el cuadro, guardandolo como vos me dijiste se van a mostrar sin problemas?

Buen día,
Con el ejemplo que te envié funciona perfectamente mostrándolo en el formulario, ya para mostrarlo en el cuadro debes implementarlo.

Cordial saludo

Gracias, ahí lo pude solucionar lo de mostrarlo en el cuadro, tengo otra duda: yo quiero subir el archivo en la carpeta img/upload/pacientes/id del paciente/archivo, cómo puedo hacer para obtener el id autoincremental de la tabla tanto cuando estoy agregando un nuevo paciente como cuando quiero modificarlo?

Me da un warning en la línea que dice $form->ef(‘sol_descripcion’)->set_botonera(‘Full’);, dice que la clave del array sol_descripcion no existe, por lo tanto me da error que está llamando el metodo set_botonera en null, y otro error que me da cuando comento esa línea es que la constante operacion_adjunto no existe.
¿Cómo puedo solucionar esto?

Puedes desactivar o quitar dicha línea, ese es un campo ef_html que tengo y dicha línea permite adicionar la botonera del ef_html. Lo de operación adjunto, también quitarla esa parte la tengo para guardar en memoria si estoy agregando o editando, para en caso de validar lo que te comentaba que el usurio NO suba un archivo muy pesado.

Lo de crear el directorio en el ejemplo es con get_www, lo puedes cambiar por get_www_img, que devuelve la ruta del directorio img, lo demás lo puedes complementar con el array, para obtener el id, después de sincronizar puedes volvar a leer el datos tabla y obtener el id serial, por ejemplo:
->sicronizar();
$datos = $this->dep(‘datos’)->tabla(‘suTabla’)->get();
$clave_id = $datos[‘campo_id’];

$array_directorios[0] = ‘upload’; //este es el nombre de la carpeta
$array_directorios[1] = ‘pacientes’; //nombre subcarpeta de la carpeta anterior
$array_directorios[2] = $clave_id; //nombre subcarpeta de la carpeta anterior
$array_directorios[3] = $nombre_archivo; //este el nombre del archivo
$directorio = $array_directorios[0].‘/’.$array_directorios[1].$array_directorios[2].‘/’.$array_directorios[3];

Lo demás se arma automáticamente con los métodos que te pasé.

Cordial saludo

Me da este error cuando intento agregar un registro: trim(): Argument #1 ($string) must be of type string, array given.
Esto es lo que tengo en los métodos para guardar y subir el archivo:
En el ci:

	function conf__formulario(toba_ei_formulario $form)
	{
		if ($this->dep("datos")->esta_cargada()) {
			$datos = $this->dep("datos")->tabla("pacientes")->get();
			if ($datos["imagen"]) {
				$temp_nombre = "/img/".$datos["imagen"];
				$temp_archivo = toba::proyecto()->get_www($temp_nombre);
				$datos["vista_previa"] = "<a href='{$temp_archivo["url"]}' target='_blank'>Abrir - ".$datos["imagen"]."";
				$tamanyo = 0;
				if(file_exists($temp_archivo["path"])) $tamanyo = round(filesize($temp_archivo["path"]) / 1024);
				$datos["imagen"] = " Tama&ntilde;o: ".$tamanyo." KB";
			} else {
				$datos["imagen"] = null;
			}
			return $datos;
		} else {
			$this->pantalla()->eliminar_evento("eliminar");
		}
	}

	function evt__formulario__modificacion($datos)
	{
		$this->dep("datos")->tabla("pacientes")->set($datos);
		$this->dep("datos")->tabla("pacientes")->sincronizar();
		if (is_array($datos["imagen"])) {
			$datos = $this->preparar_descarga ($datos);
		}
		$this->dep("datos")->tabla("pacientes")->set($datos);
	}

	function preparar_descarga ($registro)
	{
		$error_descarga = validacion::get_error_descargas ($registro);
		if ($error_descarga) toba::notificacion()->agregar($error_descarga, 'error');
		else {
			$datos = $this->dep('datos')->tabla('pacientes')->get();
			$id_paciente = $datos["id_paciente"];
			$array_directorios = array("upload","pacientes",$id_paciente);
			$registro = validacion::get_validar_descargas ($registro, $array_directorios);
		}
		return $registro;
	}

En la clase de validacion:

	static function set_crear_directorios ($array_directorios) {
		$dir_temp = toba::proyecto()->get_www ();
		$directorio = $dir_temp["path"]."/img";
		foreach ($array_directorios as $key => $value) {
			$directorio .= "/".$value;
			if(!file_exists($directorio)) mkdir ($directorio);
		}
		return $directorio;
	}

	static function get_error_descargas ($datos) {
		$mensaje = ‘’;
		if ($datos[‘imagen’][‘error’]) {
			switch ($datos[‘imagen’][‘error’]) {
				case 1: $mensaje = (“ERROR: El tamaño es mayor al definido por la configuracion de PHP.”); break;
				case 2: $mensaje = (“ERROR: El tamaño es mayor al definido en el formulario HTML.”); break;
				case 3: $mensaje = (“ERROR: El archivo solo fue parcialmente subido.”); break;
				case 4: $mensaje = (“ERROR: Ningun archivo fue subido.”); break;
				case 6: $mensaje = (“ERROR: No existe un directorio para archivos temporales.”); break;
				case 7: $mensaje = (“ERROR: Fallo la escritura en disco del archivo.”); break;
				case 8: $mensaje = (“ERROR: Alguna extensiòn de PHP interrumpio la subida del archivo.”);
				default: $mensaje = “ERROR: Fallo al tratar de subir el Archivo, contactar el Administrador”;
			}
		}
		return $mensaje;
	}

	static function get_validar_descargas ($datos, $array_directorios)    {
		$aux_datos = $datos;
		$fp = fopen($datos['imagen']['tmp_name'], 'rb');
		$imagen = "/".implode($array_directorios)."/".$datos["imagen"]["name"];
		$ruta = self::set_crear_directorios ($array_directorios);
		$archivo = $ruta.'/'.$imagen;
		if(file_exists($archivo)) {
			$imagen = date("U").'_'.$imagen;
		}
		$ruta .= "/".$imagen;
		$datos["imagen"] = $ruta;
		if (move_uploaded_file($datos['imagen']['tmp_name'], $ruta)) {
			toba::notificacion()->agregar("<center>El archivo se subio exitosamente al servidor.",'info');
			return $datos;
		} else {
			toba::notificacion()->agregar("<center>ERROR: El archivo no se logro subir con exito.",'error');
		}
		return $aux_datos;
	}

¿Dónde está ocurriendo el error?

Buen día,
Al parecer estás utilizando en algún lado que no muestras en este código, la función de php trim() que quita espacios; igual cuando muestra el error, se muestra también el archivo y el nro de la línea correspondiente.

Lo que si detecto es estas confundiendo en __modificacion(), es que debes trabajar con el campo del formulario y no con el de la BD,
[‘imagen’] creo que es el que usas para almacenar el nombre del archivo
y en el formulario el ef_upload debe ser [‘archivo’] y y [‘vista_previa’] no forman parte de la BD, si no para trabajar la interfaz

if (is_array($datos[‘archivo’])

En el ejemplo original archivo y vista previa son como camapos auxiliares solamente y en código se pasa al campo el nombre del archivo, que creo que llamas ‘imagen’

En el conf__ si lo usas bien, porque es el campo ‘imagen’ que se carga del formulario
Cordial saludo

No me da más el error, pero ahora me da otro error, me dice que no existe la clase validacion, es la que vos le pusiste navegacion, esa clase la tengo en la carpeta nucleo dentro de la carpeta php del proyecto ciftoba, en el ci le puse include("../nucleo/validacion.php") pero me da un warning que no se puede abrir el archivo, ¿cómo tengo que hacer para que la clase validacion sea visible para el ci?

Si tienes métodos de otra clase y requieres acceder a los mismos, debes indicar en el escope de CI, la ruta respectiva, en mi caso, la cree en php/libreria/navegacion.php

<?php require_once('libreria/navegacion.php'); //sobraria el ... ya que por default va a la carpeta php del proyecto y el llamdo con navegacion::metodo();

Sí, le saque el …/ al include, pero ahora cuando quiero entrar al cuadro me da error de sintaxis, dice el error unexpected token “:” pero no me dice ni el archivo ni la línea donde da el error.
Este es el código del ci:

<?php
include("nucleo/validacion.php");
class ci_administracion_de_pacientes extends ciftoba_ci
{
	protected $s__datos_filtro;


	//---- Filtro -----------------------------------------------------------------------

	function conf__filtro(toba_ei_formulario $filtro)
	{
		if (isset($this->s__datos_filtro)) {
			$filtro->set_datos($this->s__datos_filtro);
		}
	}

	function evt__filtro__filtrar($datos)
	{
		$this->s__datos_filtro = $datos;
	}

	function evt__filtro__cancelar()
	{
		unset($this->s__datos_filtro);
	}

	//---- Cuadro -----------------------------------------------------------------------

	function conf__cuadro(toba_ei_cuadro $cuadro)
	{
		if (isset($this->s__datos_filtro)) {
			$cuadro->set_datos($this->dep('datos')->tabla('pacientes')->get_listado($this->s__datos_filtro));
		} else {
			$cuadro->set_datos($this->dep('datos')->tabla('pacientes')->get_listado());
		}
	}

	function evt__cuadro__eliminar($datos)
	{
		$this->dep('datos')->resetear();
		$this->dep('datos')->cargar($datos);
		$this->dep('datos')->eliminar_todo();
		$this->dep('datos')->resetear();
	}

	function evt__cuadro__seleccion($datos)
	{
		$this->dep('datos')->cargar($datos);
		$this->set_pantalla('pant_edicion');
	}

	//---- Formulario -------------------------------------------------------------------

	function conf__formulario(toba_ei_formulario $form)
	{
		if ($this->dep("datos")->esta_cargada()) {
			$datos = $this->dep("datos")->tabla("pacientes")->get();
			if ($datos["imagen"]) {
				$temp_nombre = "/img/".$datos["imagen"];
				$temp_archivo = toba::proyecto()->get_www($temp_nombre);
				$datos["vista_previa"] = "<a href='{$temp_archivo["url"]}' target='_blank'>Abrir - ".$datos["imagen"]."";
				$tamanyo = 0;
				if(file_exists($temp_archivo["path"])) $tamanyo = round(filesize($temp_archivo["path"]) / 1024);
				$datos["archivo"] = "Tama&ntilde;o: ".$tamanyo." KB";
			} else {
				$datos["imagen"] = null;
			}
			return $datos;
		} else {
			$this->pantalla()->eliminar_evento("eliminar");
		}
	}

	function evt__formulario__modificacion($datos)
	{
		$this->dep("datos")->tabla("pacientes")->set($datos);
		$this->dep("datos")->tabla("pacientes")->sincronizar();
		if (is_array($datos["archivo"])) {
			$datos = $this->preparar_descarga ($datos);
		}
		$this->dep("datos")->tabla("pacientes")->set($datos);
	}

	function preparar_descarga ($registro)
	{
		$error_descarga = validacion::get_error_descargas ($registro);
		if ($error_descarga) toba::notificacion()->agregar($error_descarga, 'error');
		else {
			$datos = $this->dep('datos')->tabla('pacientes')->get();
			$id_paciente = $datos["id_paciente"];
			$array_directorios = array("upload","pacientes",$id_paciente);
			$registro = validacion::get_validar_descargas ($registro, $array_directorios);
		}
		return $registro;
	}

	function resetear()
	{
		$this->dep('datos')->resetear();
		$this->set_pantalla('pant_seleccion');
	}

	//---- EVENTOS CI -------------------------------------------------------------------

	function evt__agregar()
	{
		$this->set_pantalla('pant_edicion');
	}

	function evt__volver()
	{
		$this->resetear();
	}

	function evt__eliminar()
	{
		$this->dep('datos')->eliminar_todo();
		$this->resetear();
	}

	function evt__guardar()
	{
		$this->dep('datos')->sincronizar();
		$this->resetear();
	}

}

?>

Y este es el código de la clase validacion:

<?php
class validacion
{
	static function set_crear_directorios ($array_directorios) {
		$dir_temp = toba::proyecto()->get_www ();
		$directorio = $dir_temp["path"]."/img";
		foreach ($array_directorios as $key => $value) {
			$directorio .= "/".$value;
			if(!file_exists($directorio)) mkdir ($directorio);
		}
		return $directorio;
	}

	static function get_error_descargas ($datos) {
		$mensaje = "";
		if ($datos["archivo"]["error"]) {
			switch ($datos["archivo"]["error"]) {
				case 1: $mensaje = (“ERROR: El tamaño es mayor al definido por la configuracion de PHP.”); break;
				case 2: $mensaje = (“ERROR: El tamaño es mayor al definido en el formulario HTML.”); break;
				case 3: $mensaje = (“ERROR: El archivo solo fue parcialmente subido.”); break;
				case 4: $mensaje = (“ERROR: Ningun archivo fue subido.”); break;
				case 6: $mensaje = (“ERROR: No existe un directorio para archivos temporales.”); break;
				case 7: $mensaje = (“ERROR: Fallo la escritura en disco del archivo.”); break;
				case 8: $mensaje = (“ERROR: Alguna extensiòn de PHP interrumpio la subida del archivo.”); break;
				default: $mensaje = “ERROR: Fallo al tratar de subir el Archivo, contactar el Administrador”; break;
			}
		}
		return $mensaje;
	}

	/*static function get_validar_tamanyo ($datos)    {
		$mensaje = "";
		$requerimientos  = self::get_requerimientos();
		$maxima_descarga = $requerimientos[0]["reqsis_maxima_descarga"];
		if (! $maxima_descarga) $maxima_descarga = 5;
		$tamanyo_maximo  = $maxima_descarga * (1024 * 1024);
		if ($datos["archivo"]["size"] > $tamanyo_maximo) {
			$mensaje = "ERROR: El Tamaño del Archivo supera el Maximo de ".$tamanyo_maximo." Permitido en el Servidor";
		}
		return $mensaje;
	}*/

	static function get_validar_descargas ($datos, $array_directorios)    {
		$aux_datos = $datos;
		$fp = fopen($datos["archivo"]["tmp_name"], "rb");
		$imagen = "/".implode($array_directorios)."/".$datos["archivo"]["name"];
		$ruta = self::set_crear_directorios ($array_directorios);
		$archivo = $ruta."/".$imagen;
		if(file_exists($archivo)) $imagen = date("U")."_".$imagen;
		$ruta .= "/".$imagen;
		$datos["imagen"] = $ruta;
		if (move_uploaded_file($datos["archivo"]["tmp_name"], $ruta)) {
			toba::notificacion()->agregar("<center>El archivo se subio exitosamente al servidor.","info");
			return $datos;
		} else {
			toba::notificacion()->agregar("<center>ERROR: El archivo no se logro subir con exito.","error");
		}
		return $aux_datos;
	}
}
?>

¿Vos podes ver dónde está el error?

Pero, todo lo que te he enviado, es solo la parte del formulario, para al momento de crear y actualizar, ya lo del cuadro no se como lo manejas, lo anterior te funciona? cargar y visualizar la imagen en el formulario?

Ya lo encontré gracias, eran las " (comillas dobles) en el método get:_error_descargas, pero ahora tengo que ver porque no sube el archivo al servidor

Si estas con linux, debe dar todos los permisos al proyecto con
sudo chmod -R 0777 ./el_proyecto

Recordar que en formulario archivo es de tipo ef_upload, igual como está el ejemplo retorna el mensaje si se sube o no, igual verificar en el directorio respectivo.

Estoy asignando mal la ruta, me duplica las carpetas primero con / y después sin /

Creo que estas sobreescribiendo algo, y más abajo concatenas otra vez

$imagen = "/".implode($array_directorios)."/".$datos["archivo"]["name"];

debería ser solo el nombre del archivo: $imagen = $datos[“archivo”][“name”];

Tabién como precaución final y que me ha pasado es que si suben un archivo donde el nombre tiene tíldes, lo guarda pero n permite descargarlo nuevamente; para ello hay que limpiar dicho nombre con:

$imagen = selft::quitar_tildes($datos[“archivo”][“name”]);

function quitar_tildes($cadena){
	//Reemplazamos la A y a
	$cadena = str_replace(
	array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
	array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'),
	$cadena
	);

	//Reemplazamos la E y e
	$cadena = str_replace(
	array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
	array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'),
	$cadena );

	//Reemplazamos la I y i
	$cadena = str_replace(
	array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
	array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'),
	$cadena );

	//Reemplazamos la O y o
	$cadena = str_replace(
	array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
	array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'),
	$cadena );

	//Reemplazamos la U y u
	$cadena = str_replace(
	array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
	array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'),
	$cadena );

	//Reemplazamos la N, n, C y c
	$cadena = str_replace(
	array('Ñ', 'ñ', 'Ç', 'ç'),
	array('N', 'n', 'C', 'c'),
	$cadena
	);
	
	return $cadena;
}

Muchas gracias @jorozco ya funciona perfecto.
Tengo otra pregunta con respecto a las imagenes, cómo hago para achicarlas en el cuadro? Quiero que aparezcan con un ancho y alto de unos 100 px.