¿Se puede copiar un fichero así?

  • Autor Autor xcodex
  • Fecha de inicio Fecha de inicio
X

xcodex

Hola!!, estoy trabajando con un código que me respondieron aquí, el cual funciona perfecto:
PHP:
<?php
require "../include/bd-connect.php";
$pdo = bd_connect();

//Salida de archivo
$exit2 = fopen("report.csv", "w");

//Consulta para crear reporte:
$sql_libros = $pdo->prepare("SELECT id,title FROM books WHERE active = 1 ORDER BY id ASC");
$sql_libros->execute();
$resultado_libros = $sql_libros->fetchAll();

foreach ($resultado_libros as $row) {
    fputcsv($exit2, array($row["id"], $row["title"]));
}

fclose($exit2);

// forzar la descarga del archivo.
$nombre_fichero = 'report.csv';
if (file_exists($nombre_fichero)) {
    if (copy($exit2, '/web/app/')) {
        echo 'copiado OK';
    }

    header("Content-Type:text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=" . $nombre_fichero);

    readfile($nombre_fichero);
    exit;
} else {
    echo "El fichero $nombre_fichero no existe";
}
?>

El archivo se genera y descarga perfectamente, pero no logro crear una copia del mismo en el servidor.
Como pueden ver, intenté agregar...
PHP:
    if (copy($exit2, '/web/app/')) {

        echo 'copiado OK';

    }
...pero no funcionó.

¿Alguna sugerencia?.
 
Podrias probar con fopen

PHP:
// forzar la descarga del archivo.
$nombre_fichero = 'report.csv';
if (file_exists($nombre_fichero)) {
    header("Content-Type:text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=" . $nombre_fichero);

    readfile($nombre_fichero);

$csv_handler = fopen ('folder/path/report.csv','w');
fwrite ($csv_handler,$nombre_fichero );
fclose ($csv_handler);
echo 'Guardado report.csv en el directorio';

    exit;
} else {
    echo "El fichero $nombre_fichero no existe";
}
 
Hola!!, estoy trabajando con un código que me respondieron aquí, el cual funciona perfecto:
PHP:
<?php
require "../include/bd-connect.php";
$pdo = bd_connect();

//Salida de archivo
$exit2 = fopen("report.csv", "w");

//Consulta para crear reporte:
$sql_libros = $pdo->prepare("SELECT id,title FROM books WHERE active = 1 ORDER BY id ASC");
$sql_libros->execute();
$resultado_libros = $sql_libros->fetchAll();

foreach ($resultado_libros as $row) {
    fputcsv($exit2, array($row["id"], $row["title"]));
}

fclose($exit2);

// forzar la descarga del archivo.
$nombre_fichero = 'report.csv';
if (file_exists($nombre_fichero)) {
    if (copy($exit2, '/web/app/')) {
        echo 'copiado OK';
    }

    header("Content-Type:text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=" . $nombre_fichero);

    readfile($nombre_fichero);
    exit;
} else {
    echo "El fichero $nombre_fichero no existe";
}
?>

El archivo se genera y descarga perfectamente, pero no logro crear una copia del mismo en el servidor.
Como pueden ver, intenté agregar...
PHP:
    if (copy($exit2, '/web/app/')) {

        echo 'copiado OK';

    }
...pero no funcionó.

¿Alguna sugerencia?.

tienes que usar el nombre del fichero y el nuevo nombre.
 
Ya corregí ese problema, pero de todas maneras no se copia, no se como especificarle el directorio ya que no se como saberlo.

Como que no sabes bro, en cual quieres guardarlo?
 
Como que no sabes bro, en cual quieres guardarlo?

Es que el archivo se genera y enseguida aparece la opción para descargarlo.

¿Debería especificarla allí?.
PHP:
$exit2 = fopen("report.csv", "w");

Al no saber donde se almacena no puedo copiarlo a otro directorio.
 
Es que el archivo se genera y enseguida aparece la opción para descargarlo.

¿Debería especificarla allí?.
PHP:
$exit2 = fopen("report.csv", "w");

Al no saber donde se almacena no puedo copiarlo a otro directorio.

En el report.csv se escriben los datos?
si es así, entonce esto debería funcionarte!

PHP:
if (copy('report.csv', '/web/app/copia_report.csv')) {
        echo 'copiado OK';
}
 
Completo!

PHP:
<?php

require "../include/bd-connect.php";

$pdo = bd_connect();

// Nombre del csv
$nombre_fichero = 'report.csv';

//Salida de archivo
$exit2 = fopen($nombre_fichero, "w");

//Consulta para crear reporte:
$sql_libros = $pdo->prepare("SELECT id,title FROM books WHERE active = 1 ORDER BY id ASC");
$sql_libros->execute();
$resultado_libros = $sql_libros->fetchAll();

foreach ($resultado_libros as $row) {
    fputcsv($exit2, array($row["id"], $row["title"]));
}

fclose($exit2);

// forzar la descarga del archivo.

if(file_exists($nombre_fichero)){
    
    if(copy($nombre_fichero, '/web/app/copia_'.$nombre_fichero)){
        echo 'copiado OK';
    }

    header("Content-Type:text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=".$nombre_fichero);

    readfile($nombre_fichero);
    exit;
    
} else {
    
    echo "El fichero ".$nombre_fichero." no existe";
    
}

?>
 
Es que el archivo se genera y enseguida aparece la opción para descargarlo.

¿Debería especificarla allí?.
PHP:
$exit2 = fopen("report.csv", "w");

Al no saber donde se almacena no puedo copiarlo a otro directorio.


Al no indicarle un directorio, se almacena en la misma carpeta donde esta tu php.

si quieres ponerle otra ruta agregala ahí mismo "fopen("carpeta/report.csv", "w");" este ejemplo es para una carpeta que se encuentre en el mismo directorio. si se encuentra la carpeta fuera de ese directorio, puedes usar " ../ " par salir de esa carpeta, y luego le indicas la carpeta que quieras.

"fopen("../carpeta/report.csv", "w");"
 
Completo!

PHP:
<?php

require "../include/bd-connect.php";

$pdo = bd_connect();

// Nombre del csv
$nombre_fichero = 'report.csv';

//Salida de archivo
$exit2 = fopen($nombre_fichero, "w");

//Consulta para crear reporte:
$sql_libros = $pdo->prepare("SELECT id,title FROM books WHERE active = 1 ORDER BY id ASC");
$sql_libros->execute();
$resultado_libros = $sql_libros->fetchAll();

foreach ($resultado_libros as $row) {
    fputcsv($exit2, array($row["id"], $row["title"]));
}

fclose($exit2);

// forzar la descarga del archivo.

if(file_exists($nombre_fichero)){
   
    if(copy($nombre_fichero, '/web/app/copia_'.$nombre_fichero)){
        echo 'copiado OK';
    }

    header("Content-Type:text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=".$nombre_fichero);

    readfile($nombre_fichero);
    exit;
   
} else {
   
    echo "El fichero ".$nombre_fichero." no existe";
   
}

?>

Al no indicarle un directorio, se almacena en la misma carpeta donde esta tu php.

si quieres ponerle otra ruta agregala ahí mismo "fopen("carpeta/report.csv", "w");" este ejemplo es para una carpeta que se encuentre en el mismo directorio. si se encuentra la carpeta fuera de ese directorio, puedes usar " ../ " par salir de esa carpeta, y luego le indicas la carpeta que quieras.

"fopen("../carpeta/report.csv", "w");"

Gracias a ambos, pero aún siguiendo esos pasos no logro que me funcione, supongo será porque lo estoy haciendo en localhost, seguiré intentando con un hosting.
 
Uhhhhhh, no lo puedo creer, estaba haciendo esto en localhost e intentando ver los resultados en la carpeta de mi hosting jajajaja no digo mas nada. Saludos!!!
 
Uhhhhhh, no lo puedo creer, estaba haciendo esto en localhost e intentando ver los resultados en la carpeta de mi hosting jajajaja no digo mas nada. Saludos!!!
Jjajaj
 
Al no indicarle un directorio, se almacena en la misma carpeta donde esta tu php.

si quieres ponerle otra ruta agregala ahí mismo "fopen("carpeta/report.csv", "w");" este ejemplo es para una carpeta que se encuentre en el mismo directorio. si se encuentra la carpeta fuera de ese directorio, puedes usar " ../ " par salir de esa carpeta, y luego le indicas la carpeta que quieras.

"fopen("../carpeta/report.csv", "w");"

Seguí intentando y no funcionaba. Hasta que probé de subir el sitio a mi hosting y ahí si funcionó. Por lo que todo da a entender que es un tema de permisos de Linux, en fin.
Solo agrego esto por si alguien tiene el mismo problema. 🙂
 
Te doy un par de recomendaciones cuando trabajes con creación de ficheros, hace tanto creé un script que manejaba las cookies de miles de cuentas de twitter e igual me daba problema en algunos servidores:
1.- Usa __DIR__ como constante del directorio donde está el script, ya luego indicas si es en el mismo directorio tipo __DIR__.'/archivo.csv', en una carpeta superior __DIR__.'/../archivos/archivo.csv' o una carpeta inferior __DIR__.'/archivos/archivo.csv'
2.- Recuerda siempre cambiar los permisos, desde hosting no suele ser necesario, pero en linux puedes usar un "sudo chmod directorio 0644", con hacerlo en el directorio donde se crearán los archivos suele bastar, de últimas usas la flag "-r" para hacerlo de forma recursiva
 
Te doy un par de recomendaciones cuando trabajes con creación de ficheros, hace tanto creé un script que manejaba las cookies de miles de cuentas de twitter e igual me daba problema en algunos servidores:
1.- Usa __DIR__ como constante del directorio donde está el script, ya luego indicas si es en el mismo directorio tipo __DIR__.'/archivo.csv', en una carpeta superior __DIR__.'/../archivos/archivo.csv' o una carpeta inferior __DIR__.'/archivos/archivo.csv'
2.- Recuerda siempre cambiar los permisos, desde hosting no suele ser necesario, pero en linux puedes usar un "sudo chmod directorio 0644", con hacerlo en el directorio donde se crearán los archivos suele bastar, de últimas usas la flag "-r" para hacerlo de forma recursiva
¡Muchas gracias por tus recomendaciones!.
Lo que hice fué:
Bash:
sudo adduser miusuario www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

No entiendo exactamente que es lo que hace la línea que contiene g+rwX pero funcionó así jajaja.
 
¡Muchas gracias por tus recomendaciones!.
Lo que hice fué:
Bash:
sudo adduser miusuario www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

No entiendo exactamente que es lo que hace la línea que contiene g+rwX pero funcionó así jajaja.
Mi conocimiento de Linux es limitado igualmente xd, pero por lo poco que conozco g+rwX significa que al g(rupo) le añades (+) los permisos r(ead) w(rite) y e(X)ecute, que son básicamente todos los permisos disponibles
 
Mi conocimiento de Linux es limitado igualmente xd, pero por lo poco que conozco g+rwX significa que al g(rupo) le añades (+) los permisos r(ead) w(rite) y e(X)ecute, que son básicamente todos los permisos disponibles
Ahora entendí, muchas gracias 😎
 
Atrás
Arriba