Hola Julián!
Yo lo manejo desde el controlador, no se si es lo más adecuado pero me funciona bien.
Te paso el código completo del método "crear" con la posibilidad de subir la cantidad de archivos que necesites:
public function crear() {
$this->titulo = 'Crear Producto';
try {
//$productos = new Productos();
if (Input::hasPost('productos')) {
$productos = new Productos(Input::post('productos'));
$productos->begin();
// Tratamiento de imagenes
$ruta = dirname(APP_PATH) . '/public/img/upload/productos/';
$imagen = array(
array('nombre' => NULL),
array('nombre' => basename($_FILES["img1"]['name']), 'up' => Upload::factory('img1', 'image')),
array('nombre' => basename($_FILES["img2"]['name']), 'up' => Upload::factory('img2', 'image'))
);
$nombreimagen[] = array();
$uploads[] = array();
$upload = null;
$upload_error = false;
for($i = 1; $i < count($imagen); ++$i) {
if($imagen[$i]['nombre'] != NULL){
$file = $imagen[$i]['up'];
$file->setPath($ruta);
//$file->setMaxSize('512 K');
$file->setExtensions(array('jpg', 'png', 'gif'));
if ($file->isUploaded()){
$nombreimagen[$i]['nombre'] = $productos->nombre . ' ' . $imagen[$i]['nombre'];
if ($file->save($nombreimagen[$i]['nombre'])) {
if($i == 1) $productos->img1 = $nombreimagen[1]['nombre'];
if($i == 2) $productos->img2 = $nombreimagen[2]['nombre'];
$uploads[$i]['file'] = $nombreimagen[$i]['nombre'];
$upload = true;
}else{
$upload_error = true;
}
}else{
$upload_error = true;
}
}
}
// FIN Tratamiento de imagenes
// Carga del Producto en la DB
if ($productos->save()) {
if($upload_error == true){
Flash::warning('Problemas con la Imagen...!!!');
Flash::warning('El Producto no fué cargado...!!!');
// Error: volvemos todo atras (registro en db y uploads)
for($i = 1; $i < count($uploads); ++$i) {
if(isset($uploads[$i]['file'])) $file->remove($ruta, $uploads[$i]['file']);
}
$productos->rollback();
} else {
Flash::valid('El Producto fué cargado Exitosamente...!!!');
//Flash::warning('No se cargó ninguna imagen');
$productos->commit();
return Router::redirect();
}
} else {
Flash::warning('El Producto no fué cargado...!!!');
// Error: volvemos todo atras (registro en db y uploads)
for($i = 1; $i < count($uploads); ++$i) {
if(isset($uploads[$i]['file'])) $file->remove($ruta, $uploads[$i]['file']);
}
$productos->rollback();
}
// FIN Carga del Producto en la DB
}
} catch (KumbiaException $e) {
View::excepcion($e);
}
}
Espero te sirva...
Saludos!!