Recordad que para pedir soporte alguno, debéis facilitar los datos de soporte oportunos por favor, mirad aquí y leer las Normas generales del foro, esto nos servirá de ayuda para dar el mejor soporte..

Gracias.

La Administración de phpBB España.

Copia de los adjuntos con su nombre originalTema Solucionado

Soporte de MODs para phpBB 3.0.x
Dudas sobre AutoMOD aquí por favor.
Cerrado

0
No hay votos
 
Votos totales: 0

towen
Moderador
Mensajes: 489
Registrado: 27 Dic 2011, 05:17
Género:
Edad: 28

Copia de los adjuntos con su nombre original  Tema Solucionado

#1

Mensaje por towen »

Idea

Tanto el nombre de archivo utilizado por phpBB internamente como el nombre de archivo original se almacenan en la tabla de adjuntos, así que para recuperar el nombre original se pueden utilizar los datos de esa tabla.

Este script copia todos los archivos (excepto las miniaturas) subidos como adjuntos a una carpeta diferente y les cambia su nombre al nombre original, precedido por el attachment_id para evitar duplicados. Los archivos originales de phpBB no son modificados.

Los pasos

Paso 1

En primer lugar, cree un directorio llamado filebackup en la carpeta raíz de tu foro y establezca sus permisos CHMOD a 777.

Paso 2

Pegue el siguiente código en un editor de texto plano, guárdelo como rename.php y colóquelo en la carpeta raíz de su foro (donde se encuentra el config.php).

Código: Seleccionar todo

<?php
/**
* This script will copy all attachments from the attachment folder (default
* "files") to a separate directory, replacing the cryptic phpBB filename with the
* original filename, prepended by numeric attach_id to prevent duplicate filenames.
*/

/**
* @ignore
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);

// Name of script - change if you use a different name for the script
$scriptname = 'rename.php';
// Specify the number of attachments to copy in one run - reduce if you receive a timeout from server
$interval = 100;
// Specify the path for the copies - must have write access (CHMOD 777)
$copypath = 'filebackup';

// read id of last attachement copied
if (isset($config['last_attach_id']))
{
   $last_attach_id = $config['last_attach_id'];
}
else
{
   $last_attach_id = 0;
   set_config('last_attach_id', 0);
}

// count number of attachments to process
$sql = 'SELECT COUNT(attach_id) AS num_attach
    FROM ' . ATTACHMENTS_TABLE . '
WHERE attach_id > ' . (int) $last_attach_id . '
ORDER BY attach_id ASC';
$result = $db->sql_query($sql);
$attachs_count = (int) $db->sql_fetchfield('num_attach');

// Output Information
echo dheader();

// read required information from attachment table
$sql = 'SELECT attach_id, physical_filename, real_filename
    FROM ' . ATTACHMENTS_TABLE . '
WHERE attach_id > ' . (int) $last_attach_id . '
ORDER BY attach_id ASC';
$result = $db->sql_query_limit($sql, $interval);

// how many attachment do we copy in this run?
$actual_num = $db->sql_affectedrows($result);
if ($actual_num == 0)
{
    // nothing to do
    $complete = true;
}
else
{
    $complete = false;
    if ($attachs_count <= $interval)
    {
        // this is the last run
        $complete = true;
    }
    while ($row = $db->sql_fetchrow($result))
    {
        // for each attachment
        //remember id
        $last_attach_id = $row['attach_id'];
        // build source filename including path (we fetch the path from config
        $source = $phpbb_root_path . $config['upload_path'] . '/' . $row['physical_filename'];
        // build destination filename including path
        $destination = $phpbb_root_path . $copypath . '/' . $last_attach_id . "_" . $row['real_filename'];
        // copy the file
        if (copy ($source, $destination))
        {
            // write info to user
            echo sprintf("<tr><td class='succ'>copy succesful:</td><td>%s</td><td>%s</td><td>%s</td></tr>", $last_attach_id, $source, $destination);
        }
        else
        {
            echo sprintf("<tr><td class='error'>copy failed:</span></td><td>%s</td><td>%s</td><td>%s</td></tr>", $last_attach_id, $source, $destination);
        }
    }
    // write last attachment id in config
    set_config('last_attach_id', $last_attach_id);
}
// finished
echo dfooter();

function dheader()
{
    global $attachs_count, $interval;
    if ($interval > $attachs_count)
    {
        $interval = $attachs_count;
    }
    $remain = $attachs_count - $interval;

    return '<html>
    <head>
        <title>copy ' . $interval . ' attachments in this run, ' . $remain . ' remain to copy</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf8">
        <style>
            a:visited {COLOR: #3A4273; TEXT-DECORATION: none}
            a:link {COLOR: #3A4273; TEXT-DECORATION: none}
            a:hover {COLOR: #3A4273; TEXT-DECORATION: underline}
            .error {COLOR: red; ; FONT-WEIGHT: bold}
            .succ {COLOR: green; ; FONT-WEIGHT: bold}
            body, table, td {COLOR: #3A4273; FONT-FAMILY: Tahoma, Verdana, Arial; FONT-SIZE: 12px; LINE-HEIGHT: 20px; scrollbar-base-color: #E3E3EA; scrollbar-arrow-color: #5C5C8D}
            input {COLOR: #085878; FONT-FAMILY: Tahoma, Verdana, Arial; FONT-SIZE: 12px; background-color: #3A4273; color: #FFFFFF; scrollbar-base-color: #E3E3EA; scrollbar-arrow-color: #5C5C8D}
            .install {FONT-FAMILY: Arial, Verdana; FONT-SIZE: 20px; FONT-WEIGHT: bold; COLOR: #000000}
        </style>
    </head>
    <body bgcolor="#3A4273\" text="#000000">
        <table width="95%" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" align="center">
            <tr>
                <td>
                    <table width="98%" border="0" cellspacing="0" cellpadding="0" align="center">
                        <tr><th colspan="4">copy ' . $interval . ' attachments in this run, ' . $remain . ' remain to copy</th></tr>
                        <tr>
                            <th>Status</th><th>Attach_ID</th><th>phpBB internal file name</th><th>Copy with original file name</th>
                        </tr>';
}

function dfooter()
{
    global $scriptname, $complete;
    if (!$complete)
    {
        $next_step_link = '<a href="' . $scriptname . '">Click to continue with next step</a>';
    }
    else
    {
        $next_step_link = "<b>Completed</b>";
    }

    return '<tr><td colspan="4" align="center">' . $next_step_link . '</td></tr>
                    </table>
                </td>
            </tr>
        </table><br>
    </body>
</html>';
}

?>
Desde su navegador entre a http://www.su_foro.com/foro/rename.php para activar el código.

El script copia y cambia el nombre de todos los archivos (excepto miniaturas) en la nueva carpeta "filebackup". Para evitar nombres de archivo duplicados (si por ejemplo 2 usuarios utilizaron de nombre abc.jpg para un adjunto) el file_id se añade al nombre de archivo.

El script presenta una salida detallada de todos los archivos copiados, y se puede llamar múltiples veces. Sólo tiene que pulsar F5 para actualizarlo o seguir el enlace en la parte inferior de la página después de la primera ejecución.

Paso 3

Cuando haya terminado, usted puede descargar todos los archivos de la carpeta filebackup con sus nombres reales.

NOTAS
  • Si se produce un error al ejecutar la secuencia de comandos, puede reducir el número de archivos copiados (disminuyendo el valor de $interval al principio del código).
  • Aumente el valor de $interval si usted tiene un gran número de archivos adjuntos, vaya probando el valor más adecuado para sus necesidades.
  • Tenga en cuenta que cuando se tiene un gran número de archivos adjuntos es posible que ocurra un php-timeout. Pruebe a reducir el valor de $interval como se describe anteriormente.
  • El script establece un valor en la base de datos cuando se ejecuta, por lo que si el script se ejecuta de nuevo, solamente los adjuntos añadidos al foro después de su última ejecución serán copiados. Si desea volver a copiar todos los archivos adjuntos tiene que restablecer el valor en la base de datos mediante la siguiente consulta SQL:

    Código: Seleccionar todo

    UPDATE phpbb_config SET config_value = 0 WHERE config_name = 'last_attach_id';
    Donde phpbb_ es el prefijo de las tablas de su foro. Vea la Guía para insertar una consulta SQL de MODs
Gracias a t_backoff, Noxwizard, stevemaury y marc1706 por su contribución a este artículo.

Cerrado

Volver a “Soporte de MODs”