elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
21  Programación / Desarrollo Web / configuración de apache sin panel de control (entorno de producción seguro) en: 20 Julio 2016, 21:39 pm
Siempre he usado paneles de control, tipo cpanel, kloxo, etc... Pero me gustaría aprender a hacerlo manualmente y tengo un par de dudas que no consigo encontrar (o entender) en las guias existentes.

Primero decir que voy a usar ultima versión de todo, incluido el protocolo http/2. El servidor sería el típico LAMP. Solo que en lugar de mysql, mariadb.

El objetivo principal sería tener en cuenta cuestiones de seguridad importantes (y menos importantes también), como famosos problemas de openssl (arreglados en la ultima versión, por suerte) con los certificados de seguridad (esta sería la parte a configurar, si no me equivoco sería algo como "SSLProtocol -all +TLSv1.2, ¿no?).

Para ello tengo como referencia la guia LAMP de arch linux (que es de las más completas, con referencias a cuestiones de seguridad más importantes, como la de sslv3, si alguien conoce alguna más a tener en cuenta, agradeceria que la mencionara (opcionalmente con la solución)).

Una de mis primeras dudas sería el uso de mod_rewrite en los .htaccess. He estado leyendo y al parecer es algo recomendado y no recomendado. Algunos afirman que no se debe usar (en la propia web se aconseja usar como ultimo recurso) y otros explican que no hay razón para no usarlo y que además tiene sus ventajas: http://askubuntu.com/a/222880.

No voy a usar un hosting compartido ni un VPS, voy a contratar un baremetal (dedicado) de scaleway y voy a instalar/configurar todo yo mismo, por lo que no tendría razón para usarlo más que por las posibles ventajas.

Citar
Apache2 reads all config files in /etc/apache2/conf.d/. This can be good for any general configuration directives you want to add that don't relate to any particular virtual host. Just add a new file there and put config into it.

Creo que prefiero configurarlo ahí y desactivar htaccess, pero esa ruta es especifica de ubuntu creo, en arch linux es /etc/httpd/conf, ¿es ahí dentro donde puedo crear mis propios archivos de configuración? Más que nada por si alguien consigue acceder al document root mediante php, que no pueda cambiar ninguna configuración local. ¿Tiene sentido o de todas maneras seguiria habiendo riesgo? Como cambiar configuraciones desde php (la cuestión sería como configurarlo para conseguir entornos de producción seguros).

Actualmente uso htaccess con una configuración u otra dependiendo del dominio/subdominio: Por ejemplo, la web principal (y algunos subdominios) redirige todo al index.php, que sería el router de la web y usando php, incluyo archivos dependiendo de la url (y sus parametros get). Pero en el subdominio static, donde almaceno los archivos incluidos estáticos (como javascripts, css e imágenes) he deshabilitado php y aparte configuro CORS para que el dominio principal y otro subdominio puedan cargar contenido. ¿Todo esto podría hacerse desde la configuración interna en /etc/httpd/conf? ¿Mejoraria de alguna manera la seguridad?

Otra cosa que tiene un poquito que ver con la seguridad es, la redirección de http a https automática. En kloxo hay una opción para forzar la redirección, pero no veia nada en el .htaccess, por lo que debe hacer en alguna otra parte, ¿será en alguna configuración interna de apache? La redirección automatica de no-www a www sería en el mismo archivo, ¿no?

Gracias!
22  Programación / Desarrollo Web / evento on submit preventDefault no funciona en: 17 Junio 2016, 21:44 pm
Estoy usando un plugin jquery llamado formly para verificar los campos antes de mandarlos. El problema es que el evento on submit (dentro del plugin) no detiene el submit y el formulario se sigue enviando de todas formas...

Código
  1. (function($) {
  2.  
  3. $.fn.formly = function(callback) {
  4.  
  5.    // Submit button
  6.    this.on('submit', function(e) {
  7.  
  8.        // NOT WORKING AT ALL...
  9.        e.preventDefault();
  10.        var canSubmit = true;
  11.  
  12.        $(this).find('input').each(function() {
  13.  
  14.            // Required
  15.            if ($(this).attr('required')) {
  16.                canSubmit = functions.required(this);
  17.            }
  18.  
  19.            // Validate
  20.            if ($(this).attr('validate')) {
  21.                canSubmit = functions.validate(this);
  22.            }
  23.  
  24.            // Match
  25.            if ($(this).attr('match')) {
  26.                canSubmit = functions.match(this);
  27.            }
  28.  
  29.        });
  30.  
  31.        if (canSubmit) {
  32.            if (callback) {
  33.  
  34.                var clientInfo = $(this).serializeArray();
  35.  
  36.                /* Password hash function */
  37.                var p = $('#reg_pwd').val(),
  38.                    c = $('#confirm_pwd').val(),
  39.                    shaObj = new jsSHA('SHA-512', 'TEXT');
  40.  
  41.                shaObj.update(p);
  42.                var p_hash = shaObj.getHash("HEX"),
  43.                    shaObj = new jsSHA('SHA-512', 'TEXT');
  44.  
  45.                shaObj.update(c);
  46.                var c_hash = shaObj.getHash("HEX");
  47.  
  48.                callback(clientInfo, p_hash, c_hash);
  49.            }
  50.        }
  51.  
  52.    });

En mi archivo scripts.js llamo al plugin y pongo el callback que es el que debería enviar el formulario (dropzone se tiene que encargar de esto, junto a la imagen):

Código
  1.        $('#register').formly(function(clientInfo, p_hash, c_hash) {
  2.  
  3.            Dropzone.autoDiscover = false;
  4.            $('#myDropzone').dropzone({
  5.                init: function() {
  6.                    var myDropzone = this
  7.  
  8.                    myDropzone.processQueue();
  9.  
  10.                    myDropzone.on('sending', function(data, xhr, formData) {
  11.                        formData.append('client_info', clientInfo);
  12.                        formData.append('reg_pwd', p_hash),
  13.                        formData.append('confirm_pwd', c_hash);
  14.                        console.log('I just sended the info...');
  15.                    });
  16.  
  17.                    myDropzone.on('success', function(file, response) {
  18.                        myDropzone.removeFile(file);
  19.                        response == '' ? window.location.replace('//admin.inmopaco.tk/') : alert('success_' + response);
  20.                    });
  21.                }
  22.            });
  23.  
  24.        });

Para poco, dropzone me da error diciendo que ya esta inicializado... y no se sube nada. Dropzone lo tengo que inicializar fuera de formly y luego dentro tengo que procesar el queue y enviar el formulario. ¿Como prodría hacer esto sin reinicializar dropzone para que no de error?

¿Y para evitar que el formulario se envie al darle al boton? Tiene que ser dropzone el que envie el array y los hashes.

Gracias!
23  Programación / PHP / [Resuelto] mysqli rollback deja de funcionar en php 7 en: 6 Junio 2016, 03:01 am
Hace poco me cambie de hosting y le instale la ultima versión de php. Ahora el rollback no hace nada: no da error, el if en el que lo puse da true siempre y los datos se siguen insertando.

Antes usaba php 5.4 y así es como tenia mi script:

Código
  1. public function Upload() {
  2.  
  3.    try {
  4.  
  5.        // rollback should revert here
  6.        // el único cambio es el siguiente
  7.        // $mysqli->query('START TRANSACTION;');
  8.         $mysqli->begin_transaction();
  9.  
  10.        // multiple prepared statements
  11.  
  12.        if ($mysqli->commit()) {
  13.            $exit = $log;
  14.        } else {
  15.            throw new Exception('Transaction commit failed. Property ID: ' . $id);
  16.        }
  17.  
  18.    } catch (Exception $e) {
  19.  
  20.        try {
  21.  
  22.            $test = $this->owner['id'] ? 'property' : ($this->applicant ? 'demand' : 'Fatal Error: PropertyFromInput() contact error (no owner, no applicant)');
  23.  
  24.            $log = 'Rolling back new ' . $test . ' upload' . "\n";
  25.  
  26.            if (!$mysqli->rollback()) $log .= 'no rollback...' . "\n";
  27.  
  28.            if ($test == 'property') $log .= $this->cleanup_prop() ? 'property successfully cleaned up' . "\n" : 'error while cleaning up property' . "\n";
  29.  
  30.            $err_msg = $e->getMessage();
  31.  
  32.        } catch (Exception $f) {
  33.  
  34.            $err_msg .= $f->getMessage();
  35.  
  36.        }
  37.  
  38.        $usr_msg = $upload_err ? $err_msg : 'Se ha producido un error. Por favor contacte con un administrador.';
  39.  
  40.        $log .= 'User triggered an error while uploading a new ' . $test . ".\n" . 'Error message: ' . $err_msg;
  41.  
  42.        $exit = array($log, $usr_msg);
  43.  
  44.    }
  45.  
  46.    $mysqli->autocommit(TRUE);
  47.  
  48.    return $exit;
  49. }

Antes funcionaba y ahora ya no. Supongo que se debe a los cambios que ha sufrido php desde entonces.

Estuve leyendo un poco y al parecer decidieron (al fin) implementar el bloque finally, en php 5.5. El otro cambio relevante a esto fue en php 7 donde se mejora el manejo de errores.

Pero sigo sin estar seguro de donde puede estar el fallo. La única utilidad que le veo a finally en mi caso sería poner el autocommit, por que el return deberia ir fuera. Y no sé que más puede estar fallando.

¿Alguna idea? Gracias!
24  Programación / PHP / subida de archivos con nombre numerico del array en: 3 Junio 2016, 16:59 pm
Estoy teniendo problemas para extender un código existente que guarda imágenes.

Los usuarios pueden subir imagenes y también tienen que poder actualizarlas (eliminar y subir nuevas). Lo primero es lo que tengo terminado, pero lo segundo tengo dudas ya que no quiero guardar las imagenes con su nombre original y en su lugar uso el número del array:

Código
  1. $tmp_name   = $_FILES['file']['tmp_name'];
  2.  
  3. for($i = 0; $i < count($tmp_name); $i++) {
  4.  
  5.    $img_name   = '/' . ($i + 1) . '.jpg';
  6.  
  7. }

Por lo tanto si uso este código la segunda vez que suba imágenes, las que ya existen serán reemplazadas. No me importa si el orden se pierde (pero si es posible prefiero algo limpio):

1.jpg, 2.jpg, 3.jpg ---> 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg

¿Conoceis alguna manera más limpia de hacer esto? No me importa el nombre que tengan, no es de ningún uso.

Podría usar la hora de subida, algo así, pero me gustaría saber vuestras opiniones y como lo haríais vosotros.

Esta es la función completa, ¿podria mejorarse para que fuera más eficiente?

Código
  1. public function UploadImages($files, $test = '') {
  2.  
  3.    $imagesPath     = '../static.website.com/images/property/' . $this->id;
  4.    $thumbnailsPath = '../static.website.com/images/property/' . $this->id . '/thumbnails';
  5.  
  6.    $log = 'Logging Images Upload:' . "\n\n";
  7.    $upload_err = FALSE;
  8.  
  9.    if ($test == 'new') {
  10.  
  11.        // Will be any problem with $thumbnailsPath?
  12.        if (!mkdir($imagesPath) && !mkdir($thumbnailsPath)) {
  13.  
  14.            return array($upload_err, 'Upload Error: mkdir().');
  15.  
  16.        }
  17.  
  18.    }
  19.  
  20.    $imagesPath     = realpath($imagesPath);
  21.    $thumbnailsPath = realpath($thumbnailsPath);
  22.  
  23.    // Is it ok to only check for the child directory?
  24.    if ( FALSE !== $thumbnailsPath && is_dir($thumbnailsPath) ) {
  25.  
  26.        if (isset($files['file'])) {
  27.  
  28.            $tmp_name   = $files['file']['tmp_name'];
  29.            $img_size   = $files['file']['size'];
  30.  
  31.            // At least 1 image
  32.            if ($test == 'new' && $tmp_name[0] == '') {
  33.  
  34.                $upload_err = TRUE;
  35.                return array($upload_err, '¡La primera imagen es necesaria!');
  36.  
  37.            }
  38.  
  39.            for($i = 0; $i < count($tmp_name); $i++) {
  40.  
  41.                if ($tmp_name[$i] != '') {
  42.  
  43.                    if ($img_size[$i] <= 7340032) {
  44.  
  45.                        $img_name       = '/' . ($i + 1) . '.jpg';
  46.                        $thumbnail_name = '/thumbnail_' . ($i + 1) . '.jpg';
  47.  
  48.                        list($width, $height) = getimagesize($tmp_name[$i]);
  49.  
  50.                        if ($width >= 1100 && $height >= 650) {
  51.  
  52.                            $img    = imagecreatefromjpeg($tmp_name[$i]);
  53.                            $img_p  = imagecreatetruecolor(1100, 650);
  54.                            imagecopyresampled($img_p, $img, 0, 0, 0, 0, 1100, 650, $width, $height);
  55.                            imagedestroy($img);
  56.                            $img_t  = imagecreatetruecolor(180, 180);
  57.                            imagecopyresampled($img_t, $img_p, 0, 0, 0, 0, 180, 180, 1100, 650);
  58.  
  59.                            if (!imagejpeg($img_p, $imagesPath . $img_name, 70) || !imagejpeg($img_t, $thumbnailsPath . $thumbnail_name, 70)) {
  60.  
  61.                                $upload_err = TRUE;
  62.                                return array($upload_err, 'Error al subir la imagen (' . $files['file']['name'][$i] . ')');
  63.  
  64.                            } else $log .= 'IMG: ' . $img_name . ' (original name: ' . $files['file']['name'][$i] . ') uploaded successfully.' . "\n";
  65.  
  66.                            imagedestroy($img_p);
  67.                            imagedestroy($img_t);
  68.  
  69.                        } else {
  70.                            $upload_err = TRUE;
  71.                            return array($upload_err, 'La imagen: ' . $files['file']['name'][$i] . ' debe tener como mínimo 1100px de ancho y 650px de alto.');
  72.                        }
  73.                    } else {
  74.                        $upload_err = TRUE;
  75.                        return array($upload_err, 'La imagen (' . $files['file']['name'][$i] . ') pesa más de 7 MB.');
  76.                    }
  77.                }
  78.            }
  79.        } else return array($upload_err, '$files[\'file\'] is not set:' . "\n" . var_dump($files['file']) . "\n" . 'Property ID: ' . $this->id);
  80.    } else return array($upload_err, '$thumbnailsPath is false and/or not a dir: ' . $thumbnailsPath . '". Property ID: ' . $this->id);
  81.  
  82.    return $log;
  83.  
  84. }

Cualquier surgerencia es bienvenida. Gracias!
25  Programación / PHP / como aliviar la carga del servidor con muchos datos y requests en: 24 Mayo 2016, 22:18 pm
En todo desarrollo llega la hora en la que nos preguntamos de qué manera hacer nuestra aplicación más eficiente, hacer las cosas de manera que suponga la menos carga posible para el servidor.

Actualmente estoy seleccionando y mostrando; a veces es una sola fila y otras hay un limite, pero hay un apartado en el que envio todas las filas al plugin JQuery DataTables. Bueno, todas las filas pero no todas las columnas, solo las necesarias y la verdad es que tendrían que ser muchas filas (como 1000 aunque no tengo ni idea) para que empezase a afectar no solo al cliente, si no al servidor tambien cuando hayan varios usuarios pidiendo a la vez.

Me gustaría saber si realmente vale la pena cachear los datos y donde sería mejor, si en una clase de php, en memcached (es el que estoy usando) o incluso en el propio cliente (he leido algo pero no estoy seguro de si se puede hacer).

En el caso de usar una clase php para cargar todas las filas supongo que tendría que convertir la navegación de mi web a AJAX para no tener que recargar todas las filas cada vez (osea que no serviria de nada la clase).

¿Teneis alguna idea más?

Gracias!
26  Sistemas Operativos / GNU/Linux / http/2 no funciona con apache en Centos 6.7 en: 23 Mayo 2016, 07:19 am
El otro dia se dió soporte al protocolo http/2 con apache "2.4.20 (Red hat)" en kloxo-mr7 pero al parecer no funciona, lo estoy probando en una de mis webs y no se activa (sigo viendo http/1.1.

¿Hay alguien usando http/2 con apache en CentOS? Si os funciona tal vez sea un fallo en la configuración del kloxo-mr 7 o alomejor es un problema del paquete o a saber que.

Por si os interesa, está funcionando perfectamente con nginx y nginx-proxy.

Gracias.
27  Programación / PHP / volver a instanciar dentro de la clase en: 23 Mayo 2016, 03:06 am
Tengo una pequeña duda sobre una clase. Me gustaría saber por qué es necesario volver a instanciar la clase para llamar a los setters y por qué se usa el while si hay un LIMIT 1 en la query además de que no veo necesidad para un array:

Código
  1. class myClass {
  2.  
  3. private $variable_1;
  4. private $variable_2;
  5. private $variable_3;
  6.  
  7. private function generate($myClass) {
  8.    $this->variable_1 = $myClass->variable_1;
  9.    $this->variable_2 = $myClass->variable_2;
  10.    $this->variable_3 = $myClass->variable_3;
  11. }
  12.  
  13. private function addInformation($stmt) {
  14.    $i = 0;
  15.    $stmt->bind_result($variable_1, $variable_2, $variable_3);
  16.  
  17.    while ($stmt->fetch()) {
  18.        $arrayStaff[$i] = new myClass();
  19.        $arrayStaff[$i]->setVariable1($variable_1);
  20.        $arrayStaff[$i]->setVariable2($variable_2);
  21.        $arrayStaff[$i]->setVariable3($variable_3);
  22.        $i++;
  23.    }
  24.  
  25.    return $arrayStaff;
  26. }
  27.  
  28. public function StaffFromId($id) {
  29.    $mysqli = $this->aet->getAetSql();
  30.    $exit   = FALSE;
  31.  
  32.    if ($stmt = $mysqli->prepare("SELECT * FROM staff WHERE id = ? LIMIT 1")) {
  33.        $stmt->bind_param('i', $id);
  34.        $stmt->execute();
  35.        $stmt->store_result();
  36.  
  37.        if ($stmt->num_rows === 1) {
  38.            $arrayStaff = $this->addInformation($stmt);
  39.            $this->generate($arrayStaff[0]);
  40.            $exit = TRUE;
  41.        }
  42.    }
  43.  
  44.    return $exit;
  45. }
  46.  
  47. public function setVariableX($variable_X) {
  48.    $this->variable_X = $variable_X;
  49. }
  50.  
  51. public function getVariableX() {
  52.    return $this->variable_X;
  53. }
  54.  
  55. }

Si no me equivoco lo siguiente también funciona y no hace falta tener 2 funciones que hacen lo mismo, no?

Código
  1. private function addInformation($stmt) {
  2.    $stmt->bind_result($variable_1, $variable_2, $variable_3);
  3.  
  4.    $stmt->fetch();
  5.  
  6.    $this->setVariable1($variable_1);
  7.    $this->setVariable2($variable_2);
  8.    $this->setVariable3($variable_3);
  9. }

O directamente:

Código
  1. $this->variable_1 = $variable_1;

Mi conocimiento todavia es limitado por lo que ¿hay alguna razón por la que se hizo eso asi? ¿Tal vez implementar más cosas que necesiten eso? La clase la hizo un amigo con el que no he podido volver a hablar.

Gracias!
28  Sistemas Operativos / GNU/Linux / mysql error al crear/escribir un archivo dentro de /tmp en: 22 Mayo 2016, 18:18 pm
Cuando intento mostrar el contenido de una tabla, MySQL (MariaDB) devuelve el siguiente error:

Citar
Can't create/write to file '/tmp/#sql_bd5_0.MAI' (Errcode: 13 "Permission denied")

El servidor tiene pocos dias creado, estaba funcionando bien desde el principio. Esta mañana cuando voy a acceder a la base de datos me encuentro con este de error.

¿Puedo darle simplemente chmod 777 al directorio /tmp o no es seguro?

¿O es mejor idea añadir el directorio a la configuración mysql? (Como se sugiere en la documentación)

Código:
[mysqld]
tmpdir=/tmp

Estoy usando Kloxo-mr7 en centos 6.7 y no encuentro el archivo, ¿alguien sabe donde está?

Gracias!
29  Sistemas Operativos / GNU/Linux / usuarios mariadb no funcionan en kloxomr7 en: 13 Mayo 2016, 21:16 pm
Hola, estoy configurando por primera vez kloxomr7 en centos 6.7 (final) y estoy teniendo problemas con los usuarios de mysql... Se supone que con kloxo hay que configurar contraseñas y usuarios desde el panel web con el usuario admin, pero los usuarios de mysql (mariadb) creados desde kloxo no funcionan.

Para crear bases de datos hay que especificar un usuario, por ejemplo:

Base de datos: test
Usuario: test
Contraseña: laquesea123

Pero no me deja entrar, desde sqlyog community (mi pc) me dice acceso denegado y desde phpmyadmin (el vps) "Cannot log in to the MySQL server".

He intentado cambiar la contraseña root desde la opción "MySQL Password Reset" pero no importa cuantas veces la cambie, no puedo conectarme con el usuario root.

La opción "Database Admins" tampoco funciona, da igual que usuario y contraseña cree, tampoco me deja entrar. También he probado borrandolo y volviendolo a hacer...

El único usuario con el que puedo entrar es el mismo con el que entro al panel web kloxo, usuario admin. Y las bases de datos que puedo ver son las dos que hay por defecto (information_schema y test) y la primera creada, las demás no me aparecen y no hay forma de acceder a ellas...

¿Cual creeis que puede ser el problema? ¿Puede ser un problema de kloxo?

Gracias!


Edito: Al parecer la contraseña que cambio en a opción "Database Admins" funciona desde el ssh (mysql -uadmin -p) y desde phpmyadmin (vps) pero desde sqlyog community (mi pc) no funciona, es otra distinta, pero el usuario es el mismo ¿como es esto posible?
30  Programación / PHP / subir y optimizar imagenes tarda demasiado en: 7 Mayo 2016, 21:50 pm
Edito: Ahora el problema es que ocupa demasiado tiempo y se detiene la ejecución...

En el formulario permito subir como mucho 8 imagenes de 7MB máximo, así es como tengo configurado mi archivo .user.ini:

Código
  1. upload_max_filesize = 7M
  2. post_max_size = 60M
  3. memory_limit = 70M
  4. max_execution_time = 60

Si intento subir 8 imagenes de 5.2MB se detiene la ejecución y da el error. Sin embargo se procesan 7 imagenes y sus 7 thumbnails (he probado comentando las lineas del thumbnail y tarda exactamente lo mismo, no hay diferencia entre crear las imagenes solo y creas ambos: las imagenes y thumbnails).
Si en lugar de 8 subo 7 (igual de 5.2MB) el script tarda, casi lo mismo, pero termina de ejeuctarse.

No soy un experto, pero a lo mejor mi script necesita mejorarse para reducir el tiempo... Este es parte del script que sube las imagenes:

Código
  1. $tmp_name   = $_FILES['file']['tmp_name'];
  2. $img_size   = $_FILES['file']['size'];
  3.  
  4. for($i = 0; $i < count($tmp_name); $i++) {
  5.  
  6.    if ($tmp_name[$i] != '') {
  7.  
  8.        if ($img_size[$i] <= 7340032) {
  9.  
  10.            $imageInfo = getimagesize($tmp_name[$i]);
  11.            $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2,16)) * 1.65);
  12.  
  13.            if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded (integer) ini_get('memory_limit') *pow(1024, 2)) {
  14.                ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');
  15.            }
  16.  
  17.            $img_name   = '/' . ($i + 1) . '.jpg';
  18.            $thumb_name = '/thumbnail_' . ($i + 1) . '.jpg';
  19.  
  20.            list($width, $height) = getimagesize($tmp_name[$i]);
  21.  
  22.            if ($width >= 1100 && $height >= 650) {
  23.  
  24.                $img    = imagecreatefromjpeg($tmp_name[$i]);
  25.                $img_p  = imagecreatetruecolor(1100, 650);
  26.                $img_t  = imagecreatetruecolor(180, 180);
  27.                imagecopyresampled($img_p, $img, 0, 0, 0, 0, 1100, 650, $width, $height);
  28.                imagecopyresampled($img_t, $img_p, 0, 0, 0, 0, 180, 180, 1100, 650);
  29.  
  30.                if (!imagejpeg($img_p, $realpath . $img_name, 70) || !imagejpeg($img_t, $realpath . $thumb_name, 70)) {
  31.  
  32.                    $upload_err = TRUE;
  33.                    throw new Exception('Error al subir la imagen (' . $_FILES['file']['name'][$i] . ')');
  34.  
  35.                } else $log .= "\n" . 'IMG: ' . $img_name . ' (original name: ' . $_FILES['file']['name'][$i] . ') uploaded successfully.';
  36.  
  37.                imagedestroy($img);
  38.                imagedestroy($img_p);
  39.                imagedestroy($img_t);
  40.  
  41.            } else {
  42.                $upload_err = TRUE;
  43.                throw new Exception('La imagen: ' . $_FILES['file']['name'][$i] . ' debe tener como mínimo 1100px de ancho y 650px de alto.');
  44.            }
  45.        } else {
  46.            $upload_err = TRUE;
  47.            throw new Exception('La imagen (' . $_FILES['file']['name'][$i] . ') pesa más de 7 MB.');
  48.        }
  49.    }
  50. }

$img_p es la imagen optimizada y $img_t es el thumbnail que necesito guardar tambien. No estoy seguro si hay alguna diferencia entre como esta ahora y llamar imagedestroy antes, por lo menos para la primera imagen que es la que pesa bastante (suelen pesar 4-6MB resolución 4k de la camara del movil/fotos).

Tal vez se puede optimizar mi script.

Gracias!
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines