Apos varias horas tentando implementar um upload de multiplos arquivos de forma assincrona no CakePHP, finalmente consegui desenvolver algo exatamente como eu queria, vou explicar a seguir como fiz:Primeiramente baixei o plugin Uploadify do jQuery e distribui os arquivos da seguinte forma:- /app/webroot/js/: jquery-1.3.2.min, jquery.uploadify.v2.1.0.min e swfobject- /app/webroot/css/: uploadify.css- app/webroot/uploadify/: uploadify.php, uploadify.swf e cancel.png* criar uma sub-pasta chamada files(app/webroot/uploadify/files) que sera usada para guardar temporariamente os arquivos de upload.Fiz uma alteracao no arquivo uploadify.php e descomentei tudo que estava comentado para verificar o tipo do arquivo e criar o diretorio se nao existir.O arquivo ficara assim:if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/'; $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name']; $fileTypes = str_replace('*.','',$_REQUEST['fileext']); $fileTypes = str_replace(';','|',$fileTypes); $typesArray = split('\|',$fileTypes); $fileParts = pathinfo($_FILES['Filedata']['name']); if (in_array($fileParts['extension'],$typesArray)) { // Uncomment the following line if you want to make the directory if it doesn't exist mkdir(str_replace('//','/',$targetPath), 0755, true); move_uploaded_file($tempFile,$targetFile); echo "1"; } else { echo 'Invalid file type.'; }}Agora na view, importarei os javascripts e css's:<?=$javascript->link(array("jquery-1.3.2.min", "jquery.uploadify.v2.1.0.min", "swfobject"))?><?=$html->css(array("uploadify"));?>alem de adicionar o codigo parar criar o botao de upload e o botao para limpar a fila:<?= $form->file("upload") ?><a href="javascript:jQuery('#BookUpload').uploadifyUpload();">Upload</a><a href="javascript:jQuery('#BookUpload').uploadifyClearQueue();">Clear</a>no caso, o id do meu input e "Upload" e como estou no form "Book" devo referencia-lo como "#BookUpload"E criarei o seguinte bloco javascript:<script type="text/javascript"> jQuery.noConflict(); jQuery(document).ready(function() { jQuery('#BookUpload').uploadify({ 'uploader':'/uploadify/uploadify.swf', 'script':'/uploadify/uploadify.php', 'cancelImg':'/uploadify/cancel.png', 'folder':'/uploadify/files/<?=$_SESSION["Config"]["userAgent"]?>', 'fileExt':'*.zip;*.pdf;*.rar;*.txt;*.doc;*.xls;*.docx;*.xlsx;*.chm;*.tar;*.tar.gz;*.tgz;*.tar.bz;*.tar.bz2', 'fileDesc':'*.zip;*.pdf;*.rar;*.txt;*.doc;*.xls;*.docx;*.xlsx;*.chm;*.tar;*.tar.gz;*.tgz;*.tar.bz;*.tar.bz2', 'sizeLimit':104857600, 'multi':true }); });</script>Irei explicar algumas partes relevantes do codigo acima:jQuery.noConflict();: como utilizo nessa mesma view a prototype, nao posso utilizar o "$" para chamadas jquery alem de ter que utilizar essa funcao para nao gerar conflitos.jQuery('#BookUpload').uploadify({: e necessario informar o id de um input tipo "file"'folder':'/uploadify/files/<?=$_SESSION["Config"]["userAgent"]?>': Uma grande duvida que eu tive era como eu iria relacionar um livro que ainda nao foi cadastro com os arquivos subidos.A solucao que eu encontrei foi de criar uma pasta temporaria com o nome de uma variavel de sessao desse usuario, ou seja, enquanto o usuario estiver "em tempo de criacao" de um livro, os arquivos que ja foram subidos irao ficar nessa pasta temporaria. Como apontado pelo Arlindo, no caso de estar rodando em uma maquina windows, deve-se utilizar o endereco completo da pasta. ('folder':'/app/webroot/uploadify/files/...)'fileExt':'*.zip;*.pdf;*.rar;*.txt;*.doc;*.xls;*.docx;*.xlsx;*.chm;*.tar;*.tar.gz;*.tgz;*.tar.bz;*.tar.bz2': Extensoes aceitas pelo upload'sizeLimit':104857600: Tamanho maximo dos arquivos em bytes (104857600b = 100mb)'multi':true: Possibilidade de enviar mais de um arquivoPara finalizar, criei uma funcao que eu chamo no beforeSave:function beforeSave() { if (isset($_SESSION["Config"]["userAgent"])) $this->data["BookFiles"] = $this->uploadFiles(); return true; }function uploadFiles() { $dir = "uploadify/files/".$_SESSION["Config"]["userAgent"]."/"; if (is_dir($dir)) { $handle = opendir($dir); while (false !== ($file = readdir($handle))) if ($file != "." && $file != "..") { $old_name = $file; $cont = 2; while (file_exists("files/".$file)) { $file = pathinfo($file); $file = $file["filename"]."-".$cont.".".$file["extension"]; $cont++; } rename($dir.$old_name, "files/".$file); $files[] = array("name" => $file); chmod("files/".$file, 0755); } closedir($handle); rmdir($dir); return $files; } else return false; }Essa funcao so sera utilizada se o diretorio identificado pela variavel de sessao existir ("uploadify/files/".$_SESSION["Config"]["userAgent"]."/"), se existir, movo os arquivos para a pasta /app/webroot/files/ (nisso eu verifico se ja existe algum arquivo com o mesmo nome, caso existir, renomeio colocando um numeral no fim).A seguir dou permissao no arquivo (chmod("files/".$file, 0755)) e retorno um array com