it-swarm.com.de

Remote-Upload-Datei auf Server B

Ich bin mir bewusst, dass dies eine der schwierigsten Codierungen ist, die es je gab, aber ich habe darüber nachgedacht, es zu versuchen.

Im Grunde genommen versuche ich, alle (MP3-) Dateitypen zu erkennen, die über den Wordpress-Medien-Upload hochgeladen wurden, und sie an einen anderen Ort zu senden, damit sie über (FTP-Verbindung) auf einen anderen Server hochgeladen werden.

Unten ist der Code, den ich nach stundenlanger Recherche gestartet habe und ich glaube, ich stecke fest, ehrlich gesagt, ich weiß nicht einmal, ob ich an einem guten Punkt bin. Ich hoffe, jemand, der viel mehr Kenntnisse in Wordpress/PHP hat, kann mir helfen, das zu archivieren, was ich versuche zu tun. Ich mache das, um den Hauptserver vor Überlastung mit großen Dateigrößen zu schützen und auf Bilder zu beschränken.

Ich möchte, dass die auf Server B hochgeladene Struktur lautet: serverB.com/music/Year/month/file.mp3

Das Jahr und der Monat sollten vom Datum der Veröffentlichung in WordPress ('J/M') erben.

Nach dem Hochladen sollte der in WordPress angezeigte Link der der serverB.com-URL zu der Datei sein.

Vielen Dank. Unten ist der Code, den ich gestartet habe:

<?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

Das ist eine schlechte Idee. Sie werden die Integrität Ihrer Site in mehrere Fragmente auf unterschiedlichen Servern aufteilen und zusätzliche Fehlerquellen einführen. Außerdem verlieren Sie möglicherweise die Möglichkeit, Stapelverarbeitungsaufgaben für diese Dateien auszuführen.

Du sagst das:

Ich mache das, um den Hauptserver vor Überlastung mit großen Dateigrößen zu schützen und auf Bilder zu beschränken

Aber das stimmt einfach nicht. Das Bereitstellen statischer Dateien ist eine der einfachsten Aufgaben eines Webservers, und es gibt keine "Überlastung" in Bezug auf ihre Größe. Angenommen, Sie zahlen auch für die Bandbreite auf dem anderen Server, dann ist dies nur ein Nullpunkt.

Der einzige Grund, dies zu tun, ist, wenn Sie eine Datei auf ein CDN hochladen müssen (solche, die "pull" noch nicht unterstützen), dies aber zusätzlich zum normalen Datei-Upload-Prozess und nicht stattdessen tun sollten.

1
Mark Kaplun

Versuchen Sie, die('message'); hinzuzufügen, und verwenden Sie dies, um zu debuggen, wo es fehlschlägt. Versuchen Sie auch, ftp://external-server.com anstelle von external-server.com zu verwenden. Stellen Sie außerdem sicher, dass Sie Ihr FTP-Passwort verwenden. Und versuchen Sie es im aktiven Modus im Gegensatz zum passiven Modus. Als ich versuchte, per FTP hochzuladen, musste ich das tun.

Stellen Sie außerdem sicher, dass das Passwort für den FTP-Server korrekt verschlüsselt ist. Als ich es tat, hatte ich ein Problem, bei dem mein Passwort ein Symbol % verwendete, aber als ich das in meinem PHP übermittelte, würde es nicht funktionieren, musste ich das als Hex übergeben.

Manchmal fehlt auch nur ein Semikolon, das ist das Schlimmste.

1
Daniel