> Faqs > Como puedo pasar valores externos a un archivo en PHP

Como puedo pasar valores externos a un archivo en PHP

Buenos Dias, tengo el siguiente problema, tengo una funcion en JavaScript que se encarga de manipular el HTML,

Este codigo es el javascript principal :

document.addEventListener("DOMContentLoaded",() =>{
    let form = document.getElementById('form_subir');
    form.addEventListener("submit", function (event){
        event.preventDefault();
        envioparametro();
        subir_archivos(this);
    });
});

function subir_archivos(form) {
    let barra_estado = form.children[1].children[0],
        span = barra_estado.children[0],
        boton_cancelar = form.children[2].children[1];

    barra_estado.classList.remove('barra_verde', 'barra_roja');

    //Petición
    let peticion = new XMLHttpRequest();

    //Progreso
    peticion.upload.addEventListener("progress",(event) =>{
        let porcentaje = Math.round((event.loaded / event.total) * 100);

        console.log(porcentaje);

        barra_estado.style.width = porcentaje+'%';
        span.innerHTML = porcentaje+'%';
    });

    //Finalizado
    peticion.addEventListener("load",() => {
        barra_estado.classList.add('barra_verde');
        span.innerHTML = "Proceso Completado";
    });

    //Enviar datos
    peticion.open('post','subir.php');
    peticion.send(new FormData(form));
    console.log (JSON.stringify({"Extension":"pdf,PDF","Tamanio":1024})); // Si lo muestra en la consola
  
    //Cancelar
    boton_cancelar.addEventListener("click", () => {
        peticion.abort();
        barra_estado.classList.remove('barra_verde');
        barra_estado.classList.add('barra_roja');
        span.innerHTML = "Proceso Cancelado";
    });

}

Este llama a subir.php

En subir PHP con estas lineas realiza su accion correctamente sube el archivo a la carpeta indicada.

$archivo_nombre = $_FILES['archivo']['name'];
$archivo_tamanio = $_FILES['archivo']['size'];
$archivo_tipo = $_FILES['archivo']['type'];
$archivo_nombre_temporal = $_FILES['archivo']['tmp_name'];

$array = explode(".", $archivo_nombre);
$archivo_extension = end($array);

$cambiar_nombre=null;
$cambiar_nombre = sha1("ArchivoNuevo" . rand(0, 10000000));

$archivo_nombre = $cambiar_nombre.".".$archivo_extension;
$archivo_nombre = preg_replace('/ /', '_', $archivo_nombre);
$archivo_nombre = preg_replace('/%20/', '_', $archivo_nombre);
$archivo_nombre = preg_replace('/:/', '_', $archivo_nombre);

//$nombre_temporal = $_FILES['archivo']['tmp_name'];
//$nombre = $_FILES['archivo']['name'];

move_uploaded_file($archivo_nombre_temporal,'archivos/tmp/'.$archivo_nombre);

ahora lo que requiero es validar la extension del archivo asi como su tamaño y en caso de que no se cumpla pues que no lo suba al servidor.

Probe ya de distintas maneras hice un par de funciones si envia los parametros esta es una de las funciones que he estado utilizando:

function envioparametro() {

    var fData = new FormData();
    //fData.open('post','subir.php');
    fData.append("Extenso","pdf,PDF");  <<--tipo de extension
    fData.append("Tamano", 2014);       <<--Tamaño del archivo
    $.ajax({
        url : 'subirArchivo.php',
        type: 'POST',
        data: fData,
        processData: false,
        contentType: false,
        //dataType: "json",
        success: function (data) {
            alert(data);
        }
    });
}

, al momento de recibir el POST en subir.php me tira los $_FILES., no importa la forma, si va en json, utilizando (JSON.stringify({"Extension":"pdf,PDF","Tamanio":1024})); esta linea la añadi al javascript que se muestra inicialmente console.log (JSON.stringify({"Extension":"pdf,PDF","Tamanio":1024})); y muestra de manera satisfactoria los datos al igual que lo que llega desde FormData al revisar en NETWORK , las cabeceras , y demas.

Quizas este cometiendo un error al tratar de pasar los parametros asi, pero no he encontrado como hacerlo de otra manera hasta el momento. La otra idea que me esta rondando es que no puedo primero enviar los parametros y luego enviar el archivo, quizas sea un tema de que deban llegar al mismo tiempo para que sean procesados a la par por subir.php

Gracias por su atencion

Saludos

Respuestas

Enviando tanto código generas un montón de ruido a tu pregunta y es complicado leerlo todo para ver dónde están las partes importantes.

Por lo que te he entendido, le pasas a PHP los datos de los archivos extraidos con javascript ¿es así? porque eso no sería muy buena práctica. Deberías examinar esos archivos con PHP para extraer los valores en el lado del servidor, que es más seguro. No te puedes fiar de lo que te ofrezca el javascript o la programación del lado del cliente en general.

Pero en fin, el tema de enviar archivos por ajax al servidor es complejo. No puedes enviarlos tal cual usando las funciones de Ajax básicas, por eso es recomendable usar el API form-data de Javascript.

Te recomiendo que leas este artículo que quizás te ayude algo, o al menos te de algo de luz para hacer lo que necesitas. Usa jQuery, que no sería imprescindible.

Quizás yo te recomendaría más usar fetch, que es compatible con todos los navegadores actualmente y ya te lo da el navegador.

Santiago
556 18 43 21
No te preocupes, tenia que solucionar esto para el miércoles de la semana pasad no se logro el objetivo, pidieron muchos cambios Agradezco tu intención. Actualmente el servidor de producción utiliza una librería con flash, por eso urge el cambio, pero este código ha sido un dolor de cabeza. Uno de tantos problemas es que no puedo ver los "echos" del PHP en el HTML ya intente de varias maneras y no he encontrado algo que me resuelva esto. Si utilice el fetch pero me generaba mucho "ruido" con el código ya declarado y la única manera de que funcionara fue haciendo uso formData para todos los parámetros y el send