リモートサーバーに画像をアップロードする


11

Wordpressメディアアップローダーを使用して画像をアップロードしていますが、ローカルサーバーではなくリモートサーバーにアップロードする方法があるかどうか疑問に思いました。例:私のワードプレスブログはサーバーAでホストされており、メディアアップローダーを使用してサーバーAではなくサーバーBに画像をアップロードしたいと考えています。

どちらのサーバーもnginxをウェブサーバーとしてUbuntu 10.04 LTSを実行しており、どちらもftpとsftpをサポートしています。


サーバーに接続する方法のオプションは何ですか?FTP、API、またはssh?コンテンツを保存するサーバー上
Pontus Abrahamsson 2013年

サーバーに接続するための私の唯一のオプションはFTPとSSHです
Ruriko

hacklog-remote-attachmentプラグインを使用https://wordpress.org/plugins/hacklog-remote-attachment/
saman m

OPがAPIアクセスはオプションではないことを示したと理解していますが、ほとんどのアクセス可能なサイトでは新しいWordPress APIが常に利用可能です。これは古いスレッドなので、他の訪問者のために言及したいと思います。たとえば、Webサイトにアクセスできる場合、通常はAPIにアクセスできます。メディアに関する例:developer.wordpress.org/rest-api/reference/media
ryanm

回答:


14

これを行うプラグインを作成しました。それは完璧ではありませんが、その仕事をします。

あなたは私のGithubでそれを見つけることができます:https//github.com/pontusab/wp-ftp-media-library

したがって、行28のファイル内のいくつかを変更する必要があります。

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

    $settings = array(
        'host'    =>    'ip or hostname',           // * the ftp-server hostname
        'user'    =>    'username',                 // * ftp-user
        'pass'    =>    'password',                 // * ftp-password
        'cdn'     =>    'cdn.example.com',          // * This have to be a pointed domain or subdomain to the root of the uploads
        'path'    =>    '/',                        // - ftp-path, default is root (/). Change here and add the dir on the ftp-server,
        'base'    =>    $upload_dir['basedir']      // Basedir on local 
    );

このプラグインが行うことは、アップロード構造を/ year / monthから変更し、私たちのケースではサーバーAのローカルマシンにのみアップロードするようにします。次に、phpを使用してftp_connect経由でftpに接続します。この関数は、wp_generate_attachment_metadataの実行時に起動されます。次に、アップロードフォルダーでチェックを実行して、画像があるかどうかを確認します。画像がある場合は、それらすべてをftp_put経由でftpサーバーにアップロードします。アップロードが完了すると、ファイルは関数unlinkを使用してローカルマシンから削除されます

次に、プラグインは、イメージのURLを「パブリック」IPまたはFTPサーバーを指すホスト名に変更します。static.mydomain.comやcdn.mydomai.comなどを使用することをお勧めします。ftpサーバー(サーバーB)をポイントする必要があります。これにより、ftpサーバーからイメージをロードできます。

他のメンバーは、これにはftpサーバーを使用する必要があると言っていますが、実際のcdn、fuseまたはAmazon S3のようなものでマウントした方が良いでしょう。


アップロードはうまくいきましたが、エラーが発生しました警告:ftp_put()[function.ftp-put]:ファイルを作成できませんでした。/home/xxx..../plugin_file.phpの99行目
Fatih Toprak

@Pontus Abrahamsson、この素晴らしいソリューションをありがとう。ただし、サーバー上のすべてのメディアファイルを他のサーバーに送信し始めることを無効にするにはどうすればよいですか?新しくアップロードしたファイルをFTP経由で転送したいのですが。
user3605780

0

CDNを使いたいだけのようです。ほとんどのCDNが機能する方法は、イメージをローカルにロードして、CDNの場所でミラーリングすることです。次に、CDNコンテンツを指すドメインを設定し、通常のURLではなくそのドメインを使用するように画像のURLを書き換えます。

いくつかの優れたプラグインとサービスがありますが、私はW3TCとCloudfrontの経験しかありません。


はい、サーバーBに1TBのスペースがあるのにサーバーAに十分なスペースがないので5GBしかないことを除いて、CDNに似ています。
Ruriko

0

WPがファイルをアップロードする方法を理解する必要があります。POSTリクエストは、ファイルをサーバーに送信し、一時フォルダーに保存されます。その後、WPはアップロードされたファイルをテストし、コンテンツディレクトリにコピーして一時ファイルを削除します。

これは非常に複雑なプロセスです。画像の場合は、「media_upload_file」にフックして、画像かどうかを確認できます。画像の場合は、WP_Filesystemを使用してそれを外部サーバーにコピーし(メソッドftpextを使用し、オプション内でFTP資格情報を提供します)、それ以外の場合はWPにアップロードを処理させますwp_handle_upload()。ファイルを外部サーバーにコピーする場合は、WPにデータなどを設定できるように、URLをWPに提供する必要があります(添付ファイルの投稿など)。

この仕事は、コードでいっぱいの手で行われるのではありません。あなたが開発者でないなら、もっと雇うべきです。または、これを行うプラグインを検索します。


-1

SSHFSまたはFTPFSを使用して、アップロードディレクトリ用のリモートサーバー上のディレクトリをマウントできます。このようにして、WordPress自体を変更する必要はありません。

欠点は、アップロードされたファイルへのすべてのアクセスが、サーバーBがどこにあるかに応じて遅くなることです。


ホストがFUSEをサポートしていないため、SSHFSまたはFTPFSを使用できません
Ruriko

次に、ホストを切り替えます。リクエストの実装に関する最大の問題は、他のサーバー部分へのアップロードではなく(CDNにアップロードするプラグインからコードをコピーするだけ)、そこからフェッチしてサービスを提供する方法です。サーバーBへのファイルシステムレベルのアクセスがない場合、Apacheはファイルを提供できません。そのため、サーバーBをWebにアクセス可能にする必要がありますが、WordPressをそこに移動するだけで済みます。あなたは本当にあなたの状況について十分な詳細を与えていませんでした。回答を得る機会が欲しい場合は、関連するすべての詳細で質問を更新してください。
Mark Kaplun、2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.