mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
queda preview y cargar ficheros del server
This commit is contained in:
@ -797,35 +797,72 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function get_files(){
|
||||||
|
|
||||||
|
// Check if the request is a POST request
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
|
||||||
|
$presupuesto_id = $_POST['presupuesto_id'];
|
||||||
|
|
||||||
|
$model = model('App\Models\Presupuestos\PresupuestoFicheroModel');
|
||||||
|
$files = $model->getFiles($presupuesto_id);
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($files as $file) {
|
||||||
|
|
||||||
|
$size = filesize($file->file_path);
|
||||||
|
// se crea un objeto con el nombre del fichero y el tamaño
|
||||||
|
$obj = (object) array(
|
||||||
|
'name' => $file->nombre,
|
||||||
|
'size' => $size);
|
||||||
|
|
||||||
|
// se añade el objeto al array
|
||||||
|
array_push($result, $obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return json_encode($result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function upload_files(){
|
public function upload_files(){
|
||||||
|
|
||||||
|
$model = model('App\Models\Presupuestos\PresupuestoFicheroModel');
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
|
||||||
|
$presupuesto_id = $_POST['presupuesto_id'];
|
||||||
|
|
||||||
// Comprobar si se han subido archivos
|
// Comprobar si se han subido archivos
|
||||||
if (!empty($_FILES['file'])) {
|
if (!empty($_FILES['file'])) {
|
||||||
$files = $_FILES['file'];
|
$files = $_FILES['file'];
|
||||||
|
|
||||||
|
// Borrar los archivos existentes del presupuesto
|
||||||
|
$model->deleteFiles($presupuesto_id);
|
||||||
|
|
||||||
// Iterar sobre los archivos
|
// Iterar sobre los archivos
|
||||||
for ($i = 0; $i < count($files['name']); $i++) {
|
for ($i = 0; $i < count($files['name']); $i++) {
|
||||||
// Aquí puedes acceder a las propiedades del archivo
|
// Aquí puedes acceder a las propiedades del archivo
|
||||||
$name = $files['name'][$i];
|
$name = $files['name'][$i];
|
||||||
$type = $files['type'][$i];
|
|
||||||
$tmp_name = $files['tmp_name'][$i];
|
$tmp_name = $files['tmp_name'][$i];
|
||||||
$error = $files['error'][$i];
|
|
||||||
$size = $files['size'][$i];
|
|
||||||
|
|
||||||
// Crear un hash único a partir del nombre del archivo
|
|
||||||
$hash = hash('sha256', $name);
|
|
||||||
// Usar el hash como el nuevo nombre del archivo
|
|
||||||
$new_name = $hash . '.' . pathinfo($name, PATHINFO_EXTENSION);
|
|
||||||
|
|
||||||
|
$new_name = $model->saveFileInBBDD($presupuesto_id, $name, auth()->id());
|
||||||
|
|
||||||
// Se sube el fichero
|
// Se sube el fichero
|
||||||
// Pero primero se comprueba que la carpeta presupuestos exista
|
// Pero primero se comprueba que la carpeta presupuestos exista
|
||||||
if (!is_dir(WRITEPATH . 'uploads/presupuestos')) {
|
if (!is_dir(WRITEPATH . 'uploads/presupuestos')) {
|
||||||
mkdir(WRITEPATH . 'uploads/presupuestos', 0777, true);
|
mkdir(WRITEPATH . 'uploads/presupuestos', 0777, true);
|
||||||
}
|
}
|
||||||
move_uploaded_file($tmp_name, WRITEPATH . 'uploads/presupuestos/' . $new_name);
|
|
||||||
|
if(!is_null($new_name)){
|
||||||
|
move_uploaded_file($tmp_name, WRITEPATH . 'uploads/presupuestos/' . $new_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
// Borrar los archivos existentes del presupuesto
|
||||||
|
$model->deleteFiles($presupuesto_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
19
ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php
Normal file
19
ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Entities\Presupuestos;
|
||||||
|
|
||||||
|
use CodeIgniter\Entity;
|
||||||
|
|
||||||
|
class PresupuestoFicheroEntity extends \CodeIgniter\Entity\Entity
|
||||||
|
{
|
||||||
|
protected $attributes = [
|
||||||
|
"id" => null,
|
||||||
|
"presupuesto_id" => null,
|
||||||
|
"nombre" => null,
|
||||||
|
"file_path" => null,
|
||||||
|
"upload_by" => null,
|
||||||
|
"upload_at" => null,
|
||||||
|
];
|
||||||
|
protected $casts = [
|
||||||
|
"presupuesto_id" => "int",
|
||||||
|
];
|
||||||
|
}
|
||||||
100
ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php
Normal file
100
ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Presupuestos;
|
||||||
|
|
||||||
|
// Clave secreta para el cifrado y descifrado
|
||||||
|
define('SECRET_KEY', 'qnENEMHWt6sJgzGtEdfrT');
|
||||||
|
|
||||||
|
// Longitud del IV para AES-256-CBC
|
||||||
|
define('IV_LENGTH', openssl_cipher_iv_length('aes-256-cbc'));
|
||||||
|
|
||||||
|
|
||||||
|
class PresupuestoFicheroModel extends \App\Models\BaseModel
|
||||||
|
{
|
||||||
|
protected $table = "presupuesto_ficheros";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether primary key uses auto increment.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $useAutoIncrement = true;
|
||||||
|
|
||||||
|
|
||||||
|
protected $allowedFields = ["presupuesto_id", "nombre", "file_path", "upload_by", "upload_at"];
|
||||||
|
protected $returnType = "App\Entities\Presupuestos\PresupuestoFicheroEntity";
|
||||||
|
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
|
||||||
|
public static $labelField = "nombre";
|
||||||
|
|
||||||
|
|
||||||
|
public function saveFileInBBDD($presupuesto_id, $filename, $user_id) {
|
||||||
|
try{
|
||||||
|
$new_filename = $this->generateFileHash($filename);
|
||||||
|
|
||||||
|
$this->db->table($this->table . " t1")
|
||||||
|
->set('presupuesto_id', $presupuesto_id)
|
||||||
|
->set('nombre', $filename)
|
||||||
|
->set('file_path', WRITEPATH . 'uploads/presupuestos/' . $new_filename)
|
||||||
|
->set('upload_by', $user_id)
|
||||||
|
->set('upload_at', date('Y-m-d H:i:s'))
|
||||||
|
->insert();
|
||||||
|
|
||||||
|
return $new_filename;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteFiles($presupuesto_id){
|
||||||
|
|
||||||
|
$files = $this->db
|
||||||
|
->table($this->table . " t1")
|
||||||
|
->where('presupuesto_id', $presupuesto_id)->get()->getResult();
|
||||||
|
if($files){
|
||||||
|
foreach($files as $file){
|
||||||
|
if(file_exists($file->file_path)){
|
||||||
|
unlink($file->file_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->db
|
||||||
|
->table($this->table . " t1")
|
||||||
|
->where('presupuesto_id', $presupuesto_id)->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Función para convertir el nombre y extensión de un fichero en un hash único
|
||||||
|
* usando cifrado simétrico.
|
||||||
|
*
|
||||||
|
* @param string $filename Nombre del fichero con extensión
|
||||||
|
* @return string Hash encriptado del fichero
|
||||||
|
*/
|
||||||
|
private function generateFileHash($filename) {
|
||||||
|
$iv = openssl_random_pseudo_bytes(IV_LENGTH); // Generar un IV aleatorio
|
||||||
|
$encrypted = openssl_encrypt($filename, 'aes-256-cbc', SECRET_KEY, 0, $iv);
|
||||||
|
return base64_encode($iv . $encrypted); // Combinar IV y texto encriptado, y codificar en base64
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Función para obtener el nombre del fichero original a partir de un hash encriptado
|
||||||
|
* usando cifrado simétrico.
|
||||||
|
*
|
||||||
|
* @param string $hash Hash encriptado del fichero
|
||||||
|
* @return string|null Nombre original del fichero, o null si falla el descifrado
|
||||||
|
*/
|
||||||
|
private function getFileNameFromHash($hash) {
|
||||||
|
$data = base64_decode($hash);
|
||||||
|
if ($data === false) {
|
||||||
|
return null; // Error en la decodificación base64
|
||||||
|
}
|
||||||
|
$iv = substr($data, 0, IV_LENGTH);
|
||||||
|
$encrypted = substr($data, IV_LENGTH);
|
||||||
|
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', SECRET_KEY, 0, $iv);
|
||||||
|
return $decrypted !== false ? $decrypted : null; // Verificar si el descifrado fue exitoso
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -220,7 +220,7 @@ if(<?php echo $presupuestoEntity->estado_id?>==2){
|
|||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
Dropzone.autoDiscover = false;
|
Dropzone.autoDiscover = false;
|
||||||
|
|
||||||
var dropzoneMulti = new Dropzone('#dropzone-multi', {
|
var dropzoneMulti = new Dropzone('#dropzone-multi', {
|
||||||
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
||||||
@ -233,7 +233,18 @@ if(<?php echo $presupuestoEntity->estado_id?>==2){
|
|||||||
autoProcessQueue: true,
|
autoProcessQueue: true,
|
||||||
acceptedFiles: 'image/*, application/pdf',
|
acceptedFiles: 'image/*, application/pdf',
|
||||||
maxFilesize: 5e+7, // Bytes
|
maxFilesize: 5e+7, // Bytes
|
||||||
|
init: function() {
|
||||||
|
thisDropzone = this;
|
||||||
|
$.get('upload.php', function(data) {
|
||||||
|
$.each(data, function(key,value){
|
||||||
|
|
||||||
|
var mockFile = { name: value.name, size: value.size };
|
||||||
|
thisDropzone.options.addedfile.call(thisDropzone, mockFile);
|
||||||
|
thisDropzone.options.thumbnail.call(thisDropzone, mockFile, "uploads/"+value.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#presupuesto-cliente-form').submit(function(e){
|
$('#presupuesto-cliente-form').submit(function(e){
|
||||||
@ -246,6 +257,8 @@ if(<?php echo $presupuestoEntity->estado_id?>==2){
|
|||||||
formData.append('file[' + i + ']', file);
|
formData.append('file[' + i + ']', file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formData.append('presupuesto_id', <?= $presupuestoEntity->id ?>);
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
url: "<?= site_url('presupuestos/presupuestocliente/upload_files') ?>",
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
|
|||||||
2662
xdebug.log
2662
xdebug.log
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user