web-dev-qa-db-fra.com

Téléverser un fichier sur le serveur B

Je suis conscient que c'est peut-être l'un des codages les plus difficiles à faire, mais j'ai pensé essayer.

Essentiellement, j'essaie de détecter tous les types de fichiers (mp3) chargés via le téléchargement de média Wordpress et de les envoyer hors site, afin qu'ils soient chargés sur un autre serveur via (connexion ftp).

Vous trouverez ci-dessous le code que j'ai commencé après des heures de recherche et je pense que je suis coincé. Honnêtement, je ne sais même pas si je suis à un bon point. J'espère que quelqu'un qui a beaucoup plus de connaissances avec Wordpress/PHP pourra m'aider à archiver ce que j'essaie de faire. Je fais ceci pour sauver le serveur principal de la surcharge de fichiers volumineux et le limiter aux images.

Je voudrais que la structure téléchargée sur le serveur B soit la suivante: serverB.com/music/Year/month/file.mp3

L'année et le mois doivent hériter de la date de publication de wordpress ("Y/m");

Une fois téléchargé, le lien qui apparaît dans wordpress doit être celui de serverB.com url vers le fichier.

Je vous remercie. Voici le code que j'ai commencé:

<?php
/* 
 * Change upload directory/server for mp3 files 
 * Only works in WordPress 3.3+
 */

add_filter('wp_handle_upload_prefilter', 'music_pre_upload');
add_filter('wp_handle_upload', 'music_post_upload');

function music_pre_upload($file){
add_filter('upload_dir', 'music_remote_upload_dir');
return $file;
}

function music_post_upload($fileinfo){
remove_filter('upload_dir', 'music_remote_upload_dir');
return $fileinfo;
}

function music_remote_upload_dir($path){    
$extension = substr(strrchr($_POST['name'],'.'),1);
if(!empty($path['error']) ||  $extension != 'mp3') { return $path; } // if other     filetype send to default uploads folder.

    /**
     * Change this to match your server
     * You only need to change the those with (*)
     * If marked with (-) its optional 
     */

    $post_date = '/' . date( 'Y/m' );

    $settings = array(
            'Host'          =>        'Host or IP',       // * the ftp-server hostname
            'user'          =>        'ftp-username',                // * ftp-user
            'pass'          =>        'ftp-pass',       // * ftp-password
            'cdn'           =>        'external-server.com',          // * This have to be a pointed domain or subdomain to the root of the uploads
            'path'          =>        '/music',                    // - ftp-path, default is root (/). Change here and add the dir on the ftp-server
            'date'          =>        $post_date          // Local post date
    );

    /**
     * Host-connection
     * Read about it here: http://php.net/manual/en/function.ftp-connect.php
     */

    if(function_exists('ftp_ssl_connect'))
     {

    $connection = ftp_ssl_connect( $settings['Host'] );

     }
        else
     {
    $connection = ftp_connect( $settings['Host'] );
     }

    /**
     * Login to ftp
     * Read about it here: http://php.net/manual/en/function.ftp-login.php
     */

    $login = ftp_login( $connection, $settings['user'], $settings['pass'] );

    /**
     * Check ftp-connection
     */

    if ( !$connection || !$login ) {
        die('Connection attempt failed, Check your settings');
    }

   ftp_pasv($resource, true); // To avoid rectify warning

   if( ftp_put( $connection, $settings['path'] . "/" . $settings['date'] . "/" . $file, FTP_BINARY ) ) {

      echo "successfully uploaded $file\n";

        } else {

      echo "There was a problem while uploading $file\n";
      }

      // close the connection
       ftp_close($conn_id); 



} // End function
6
Gmedy Cole

C'est une mauvaise idée. Vous allez diviser l'intégrité de votre site en plusieurs fragments, chacun sur un serveur différent, en introduisant des points de défaillance supplémentaires et vous risquez de perdre la possibilité d'exécuter une tâche de traitement par lots liée à ces fichiers.

Vous dites que:

Je fais cela pour sauver le serveur principal de la surcharge de fichiers volumineux et le limiter aux images

Mais ce n'est tout simplement pas vrai. Servir des fichiers statiques est l’une des tâches les plus simples d’un serveur Web et il n’ya pas de "surcharge" liée à leur taille. En supposant que vous payiez aussi pour la bande passante sur l'autre serveur, il n'y a aucun intérêt à le faire.

La seule raison de faire une telle chose est lorsque vous devez télécharger un fichier sur un CDN (ceux qui ne supportent toujours pas "pull"), mais que vous devez le faire en plus du processus normal de téléchargement de fichier et non à la place de celui-ci.

1
Mark Kaplun

Essayez d’ajouter die('message'); et utilisez-le pour déboguer en cas d’échec. Essayez également d’utiliser ftp://external-server.com au lieu de external-server.com. Assurez-vous également que vous utilisez votre mot de passe FTP. Et essayez-le en mode actif par opposition au mode passif. Quand j'essayais de télécharger par FTP, c'est ce que je devais faire.

Assurez-vous également que le mot de passe du FTP est correctement codé. Quand je le faisais, je rencontrais un problème où mon mot de passe utilisait le symbole %, mais lorsque je soumettais cela dans mon PHP cela ne fonctionnerait pas, je devais le soumettre au format hexadécimal.

Parfois aussi, il ne manque qu'un point-virgule, c'est le pire.

1
Daniel