Firt, lo obvio deben establecerse: que no realidad puede establecer el destino de la carga con JavaScript/jQuery/jWhateverPlugin (es decir, desde el lado del cliente), por razones obvias de seguridad.
Pero puede pasar información junto con el motor del lado del servidor (en su caso, PHP), que puede usarlo para administrar el almacenamiento real de la carga.
Existen varios juegos de herramientas para ayudarlo, como el jQuery File Upload de blueimp con el que comenzó inicialmente, o Uploadify, que Benno promocionó por primera vez y pareció cumplir sus requisitos.
Así que lo que tiene que hacer es personalizar las secuencias de comandos del lado del servidor y del lado del servidor para implementar pasando las variables de directorio y usarlas para definir la ubicación de almacenamiento.
fuertemente basada en la Uploadify documentation, y el uso de la variable de project_uid
, este whould aspecto:
En el lado del cliente (JavaScript + jQuery + Uploadify):
var project_uid;
// populate project_uid according to your needs and implementation
// befor using uploadify
$('#file_upload').uploadify({
'method' : 'post',
// pass your variable to the server
'formData' : { 'project_uid' : project_uid },
// optional "on success" callback
'onUploadSuccess' : function(file, data, response) {
alert('The file was saved to: ' + data);
}
});
Y en el servidor -side (PHP + Uploadify):
// Set $someVar to 'someValue'
$untrustedProjectUid = $_POST['project_uid'];
// Remember to check heavily the untrusted received variable.
// Let's pretend you checked it, it passe your tests, so you
// initialized a trusted var with it
$trustedProjectUid = ensureSecure($untrustedProjectUid);
$targetFolder = '/uploads/' . $trustedProjectUid . '/' ; // Relative to the root
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // Put you allowed file extensions here
$fileParts = pathinfo($_FILES['Filedata']['name']);
if (in_array($fileParts['extension'],$fileTypes)) {
move_uploaded_file($tempFile,$targetFile);
echo $targetFolder . '/' . $_FILES['Filedata']['name'];
} else {
echo 'Invalid file type.';
}
}
¿Qué plugin estás usando? Uploadify? Si tiene control sobre la configuración de la ruta para cargar en JavaScript, debe poder cambiar esa ruta dinámicamente dependiendo de otras variables, por ejemplo, id del proyecto/nombre del archivo. – Benno
No puede cargar directamente en cualquier carpeta que desee con php, supongo que todos van primero a una carpeta temporal general, y luego usan move_upload_file donde quiera. – Anonymous
El complemento se llama carga de archivo jQuery, se puede encontrar aquí: http://blueimp.github.com/jQuery-File-Upload/ – user1378715