異なるサーバでの画像アップロードに失敗する理由と解決方法

このQ&Aのポイント
  • サーバAとサーバBの二つのサーバがあり、画像ファイルを両方にアップロードしたい場合、imagejpegでfalseが返ってくることがあります。
  • 異なるサーバにアップロードする場合、imagejpegの第二引数にはファイルのパスではなくURLを指定する必要があります。
  • また、サーバB側の設定によっては外部からのファイルアップロードが制限されている場合があるため、サーバBの設定を確認する必要があります。
回答を見る
  • ベストアンサー

imagejpeg

サーバA、サーバBという二つのサーバがあります。 選択された画像をサーバAにアップロードする処理を作成しました。 同時にサーバBにも同じ画像ファイルをアップロードしたいです。 仮に画像ファイルがjpgとして、 $image_new = @imagecreatetruecolor ( $new_width, $new_height ) or die ("Cannot Initialize new GD image stream"); imagejpeg($image_new, './gazou.jpg'); imagejpeg($image_new, 'http://サーバB/gazou.jpg'); 以上をサーバAに置いたファイルから実行したところ、 サーバ1には画像がアップロードされるのですが、サーバBにはされませんでした。 どうやらサーバBを指定しているimagejpegでfalseが返ってきているようなのですが、 異なるサーバだとうまくいかない等あるのでしょうか? 解決方法がよくわかりません。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

imagejpeg($image_new, 'http://サーバB/gazou.jpg'); この記述に関してですが、外部のサーバに置いてあるファイルに対して、HTTPプロトコルで内容を改変することは出来ません。 できちゃったら、アップロードするプログラムを組む必要もないし、FTPというプロトコルも必要無くなってしまいますよね。 サーバAにアップロードしたファイルを同時にサーバBにアップロードするということで、実現可能なアプローチとしては、 ・サーバBにもサーバAに設置してあるアップロードプログラムと同等の物を設置し、fsockopen関数などでHTTPヘッダを書いてやる(ブラウザの挙動と同じことをプログラムでさせる) ・サーバBへ、FTP関数などを用いてFTPで接続して、該当ファイルをアップロードする といったところになり、そこそこ手間をかける必要があります。

labilion
質問者

お礼

やはりFTP関数を使わないとどうにもならなそうですね… サーバ間でcopyができないので、同時に作成できればと思ったんですが、 結局同じですもんね。 ありがとうございます。

その他の回答 (1)

回答No.1

こんばんは。 やった事ないけど、多分無理じゃないかな・・・。 というか、1回目で'./gazou.jpg'を出力しているので、 file_put_contents('./gazou.jpg', 'http://サーバB/gazou.jpg'); ってやっちゃえば?

labilion
質問者

お礼

ありがとうございます。 その方法で試してみますね。

関連するQ&A

  • imagecreatetruecolor()関数でのエラー

    imagecreatetruecolor()関数を使用するのですが どうしてもエラーが起きてしまい、使用できません。 そのソースですが $img1tmp = $_FILES['img1']['tmp_name']; list($width,$height)=getimagesize($img1tmp); header ("Content-type: image/jpeg"); $src=@imagecreatefromjpeg($img1tmp); $dst=@imagecreatetruecolor($cwidht1,$cheight1) or die ("Cannot Initialize new GD image stream"); imagecopyresized($dst,$src,0,0,0,0,$cwidth1,$cheight1,$width,$height); $boRtn1=imagejpeg($dst,「保存場所.ファイル名」); となってます。 各変数には、ちゃんと数値等は指定されています。 GDライブラリも問題なくインストールされているのですがimagecreatetruecolor()関数が動かず、上記で指定しているCannot Initialize new GD image streamが 表示されてしまいます。 どうぞ、よろしくお願い致します。

    • 締切済み
    • PHP
  • 「imagejpeg」(GD)で作成した画像を保存できない

    <?php // 空の画像を作成し、テキストを追加します $im = imagecreatetruecolor(120, 20); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); // content type ヘッダを、ここでは image/jpeg と設定します header('Content-type: image/jpeg'); // 画像を出力します imagejpeg($im); // メモリを開放します imagedestroy($im); ?> http://www.php.net/manual/ja/function.imagejpeg.php を参照して(そのまま利用して)、画像を作成して表示させてみました。 すると、これはその通り、うまく画像が表示されました。 しかし、 <?php // 空の画像を作成し、テキストを追加します $im = imagecreatetruecolor(120, 20); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); // 【追加分】: 画像を保存する imagejpeg($im, 'new.jpg'); // content type ヘッダを、ここでは image/jpeg と設定します header('Content-type: image/jpeg'); // 画像を出力します imagejpeg($im); // メモリを開放します imagedestroy($im); ?> のように imagejpeg($im, 'new.jpg'); を挿入して、その画像を保存しようとしているのですが、うまくいきません。(何も起こりません。) ちなみに、保存するためのディレクトリのパーミッションはその親ディレクトリを含め、(7,7,7)です。 「new.jpg(相対パス)」を「/www/.../new.jpg」のように絶対パスを使ってやっても結果は同じでうまくいきませんでした。 どのようにすれば、新しく作成した画像を保存できるのでしょうか? ちなみに、OSはLinux(Fedora10)です。もちろん、GDは先のテストで証明される通り、動作していると思います。 よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP GD 画像が縮小できない

    宜しくお願いします。 ※ローカル環境です。 (WinXP PHP5 Smarty PEAR MySQL ※GDはインストされています。) 下記のコードで、サーバーにもともと上げてある画像(jpeg)を縮小して、 それをブラウザに表示させようと思います。 ですが、縮小されずに、元の画像サイズのまま表示されてしまいます。 おかしな点をご指摘下さいませ。 また、(1)で、 jpegファイルを取り込むコードがありますが、これは、 もし画像がGIFであったりPNGの場合を顧慮するなら、 取り込む際にそれぞれを判定するのが基本でしょうか? もし、今回のようにサバー元の画像をリサイズするのであれば、拡張子もわかっていますので、 jpegファイルだけのことを考えればいいですが、 たとえば、任意のアップロードされたファイルを扱う場合は、上記3種類を判定すして処理すべきですよね? 以上、2点を回答下さいませ。 // -- (1) // 画像を読み込む。 $file_path = "http://www元画像.com/img/aa.jpg"; $image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む /*********** $image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む $image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む ************/ // -- (2) // 画像のサイズを取得。 $width = ImageSX($image); //横幅(ピクセル) $height = ImageSY($image); //縦幅(ピクセル) // -- (3) // 縮小した画像のサイズを決める。 $new_width = 100; $rate = $new_width/$width; //圧縮比 $new_height = $rate*$height; // -- (4) // 空の画像を作成する。 $new_image = ImageCreateTrueColor($new_width, $new_height); // -- (5) // サンプリングしなおす  ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height); // -- (6) // ブラウザに出力する場合。 ImageJPEG($image); //ImageJPEG($image,'simpletext.jpg'); //ImageGIF($image); //環境によっては使えない //ImagePNG($image); // -- (7) // メモリを解放する。 imagedestroy ($new_image); imagedestroy ($image);

    • ベストアンサー
    • PHP
  • [PHP]GDを利用した画像リサイズについて

    [PHP]GDを利用した画像リサイズについて GDを利用した画像リサイズ処理を行うクラスを作ったのですが、 以下のようなエラー(文字化け)が出てしまい画像出力することができません。 有識者の方、どうか知恵をお貸しください。宜しくお願い致します。 ????JFIF??;CREATOR: gd-jpeg v1.0 (using IJG JPEG v70), quality = 75 ??C    $.' ",#(7),01444'9=82<.342??C  2!!22222222222222222222222222222222222222222222222222??II"?? ???}!1AQa"q2???#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ???w!1AQaq"2?B???? #3R?br? -------- 以下省略 ---------- ◆作成したPHPファイル ・test.php <?php require_once 'Image.php'; $path = './400x300.jpg'; $r = new Image($path, 75); $r->resize(75); ?> ・Images.php <?php class Image{ var $new_width; var $path; function Image($path, $new_width){ @header("Content-type: image/jpeg"); $this->path = $path; $this->new_width = $new_width; } function resize(){ global $new_width; global $path; // 画像パス $image = imagecreatefromjpeg($this->path); // 画像のサイズを取得 $width = 150; $height = 150; $rate = $this->new_width / $width; $new_height = $rate * $height; $thumb = imagecreatetruecolor($this->new_width, $new_height); imagecopyresized($thumb, $image, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); // imagecopyresampled($thumb, $image_path, 0, 0, 0, 0, $this->new_width, $new_height, $width, $height); imagejpeg($thumb, null, 75); imagedestroy($image); } } ?> ◆環境と状況 ・サーバ:WindowsXP(XAMPPを利用してローカル環境を構築) ・phpinfo()にて、GD Support=enabled、JPEG Support=enabledを確認 ・ステップ実行(デバック)にてimagejpeg($thumb, null, 75);まで問題なく実行可能。  ※imagejpeg($thumb, null, 75);実行後上記文字列が出力される。 ・コメントアウト個所のimagecopyresampledでも動作結果は同じ。 ・参考にしたサイト  http://goodjob.boy.jp/chirashinoura/id/79.html 恐れ入りますが、ご回答お願い致します。

    • ベストアンサー
    • PHP
  • imagejpegで表示されない。

    ◆環境◆ PHP Version 5.1.6 apache : 2.x GD Support: enabled GD Version: bundled (2.0.28 compatible) FreeType Support : enabled FreeType Linkage : with TTF library FreeType Version : 1.4 GIF Read Support : enabled GIF Create Support : enabled JPG Support : enabled PNG Support : enabled WBMP Support : enabled XBM Support : enabled ◆質問◆ 既にアップロードされた画像をサムネイルして、表示したいのですが、 バイナリ表示までは出来たのですが、画像が表示できません。 ※$imgにはhttp://www.xxxx.com/image/abcといったファイル名までの絶対パスを取得した文字列が入ります。 <?php $new_img = $img."_thumb.jpg"; $old_img = $img.".jpg"; if(is_dir($img)){ unlink($new_img); }else{ mkdir($img); } list($old_width, $old_height, $old_type, $old_attr) = getimagesize($old_img); //縮小のサイズ $thumbwidth=93; $thumbheight=30; //画像の縮小 $src_im = imagecreatefromjpeg($old_img);//元の画像 $dst_im = imagecreatetruecolor($thumbwidth, $thumbheight);//縮小画像 imagecopyresampled($dst_im,$src_im,0,0,0,0,$thumbwidth,$thumbheight,$old_width,$old_height); imagejpeg($dst_im,$new_img); ?> 一番最後の imagejpeg($dst_im,$new_img); を imagejpeg($dst_im); にするとバイナリが表示されるのですが、 imagejpeg($dst_im,$new_img); にすると何も表示されなくなってしまいます。。 $new_imgのURLにアクセスしても画像が生成されていないようです。 header('Content-type: image/jpeg');を追記すれば良いのか!とも思ったのですが、 追記後にページを見るとサイトのURLが表示されるだけになってしまったり・・。 色々試してみましたが、万策尽き、ご質問させて頂きました。 何か根本的な事が間違っている様な気もしますが、 ご教授願えたらと思います。 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 写真のアップロードについて

    こんにちは、初心者で聞く人なく困っています。 yahooのオークションに出品の際、写真のアップロードができません。ヘルプコーナーに「デスクトップに画像ファイルgazou.jpgを置いた場合、c:\windous\デスクトップ\gazou.jpgのようになります。この場合は、マイコンピューターを開き、c:ドライブにgazou.jpgを置いてアップロードを行ってください。」と載っていました。この方法が具体的にどのようにしたらよいのかわかりません。特にc:ドライブにgazou.jpgを置いて、というところです。いろいろ試してみましたが、やっぱりアップロードができませんので、分かる方、教えてください。

  • PHPバッファリングで出力した文字列をセッションで

    こんんばんは。この度もよろしくお願いします。 phpを勉強中の者です。 GDを使って画像をリサイズし、ブラウザに表示したり、データベースに保存したりしたいです。そこで、質問なのですが、バッファリングで出力した文字列をセッションで使うことはできないのでしょうか? 以下のようにしてみましたが、別ページで引き継ぎできません。 セッションで使うためにはどうすれば良いのでしょうか。 そもそもセッションでは使うことができない……まるっきり私の理解が間違っているのでしょうか。 よろしくお願いします。 $filename = 'test.jpg'; $percent = 0.5; list($width, $height) = getimagesize($filename); $new_width = $width * $percent; $new_height = $height * $percent; $image_p = imagecreatetruecolor($new_width, $new_height); $image = imagecreatefromjpeg($filename); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); ob_start(); imagejpeg ($image_p); $img = ob_get_contents(); ob_end_clean(); $_SESSION['img'] = $img; ←できません!

    • ベストアンサー
    • PHP
  • GD の認識に関して

    PHP で GD の利用に関してアドバイスをください。 OpenPNE を設定し、プロフィールの画像(jpg)等をアップロードすると、ブラウザの画面が真っ白になり、画像(jpg)をアップロードすることが出来ません。他に日記でも画像(jpg)をアップロードしようとすると同じ現象で出来ません。少し調べた所、PHP から GD が認識されていない可能性があると思ってきました。 phpinfo を見てみても、gd の項目がありません。 サーバはさくらインターネットの FreeBSD を借りています。 サーバ内を確認した所 gd-2.0.33_4,1 jpeg-6b_4 png-1.2.8_3 php5-zlib-5.1.6_1 は入っています。 思うに、php,ini の設定かと思います。もしかしたら他に何かモジュールが必要なんでしょうか、何処を確認したら良いか、アドバイスを頂ければと思います。 PHP のバージョンは 5.16 です。 ちなみに、以下のページで同じ現象が発生しています。 http://docs.openpne.jp/?cmd=read&page=TROUBLE%2F96&word=%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C9

    • ベストアンサー
    • PHP
  • 画像のアップに関して

    画像のアップロードしたいのですが、 下記の記述方法でアップしようとすると エラーメッセージで 「Warning: imagejpeg() [function.imagejpeg]: Unable to open '../members/img/38.jpg' 」 と表示されてうまく行きません。初歩的なミスかもしれませんが 御指導お願い致します。 なお下記の  $upload = "../members/img/";  $new_pic = "../members/img/"; を  $upload = "./img/";  $new_pic = "./img/"; とうまく表示されるのですが、どうしてかわかりません。 御指導お願い致します。 if ( $_SERVER['REQUEST_METHOD'] == "POST" ) { $target = $_FILES['MyUploadFile']['name']; $target = strtoupper($target); $ext = array("JPG","JPEG"); $file_ok = false; foreach( $ext as $Value ) { $target2 = basename( $target, $Value ); if ( strlen( $target2 . $Value ) == strlen( $target ) ) { $file_ok = true; break; } } if ( $file_ok ) { if ( is_uploaded_file( $_FILES['MyUploadFile']['tmp_name'] ) ) { $upload = "../members/img/"; $upload .= $_FILES['MyUploadFile']['name']; $new_pic = "../members/img/"; $new_pic .= $job_id .".jpg"; # テンポラリディレクトリにある実際のファイル $file = $_FILES['MyUploadFile']['tmp_name']; # ファイルの属性等を取得 $target = getimagesize( $file ); # 現在のサイズ $width = $target[0]; $height = $target[1]; # 新しいサイズ $width_new = 250; $height_new = (int)( ($height/$width)*$width_new ); # JPEG の場合 if ( $target[2] == IMAGETYPE_JPEG ) { # 元のファイルのハンドル $jpeg = imagecreatefromjpeg ( $file ); # 新しいイメージ $jpeg_new = imagecreatetruecolor( $width_new, $height_new ); # サイズ変更して新しいイメージへ転送 $ret = imagecopyresampled( $jpeg_new, $jpeg, 0, 0, 0, 0, $width_new, $height_new, $width, $height ); if ( !$ret ) { print "サイズ変更に失敗しました\n"; return; } # JPEG ファイルとして、クオリティ 100 で出力 $ret = imagejpeg ( $jpeg_new, $new_pic, 100); if ( !$ret ) { print "ファイル作成に失敗しました\n"; return; } print "アップロードが完了しました\n"; print "<IMG src='$new_pic'>"; } } else { print "アップロードに失敗しました\n"; } } }

    • ベストアンサー
    • PHP
  • 複数の画像からランダム抽出して、自動でそのファイル名を変更して、アップできる?

    すいません、プログラミングとか超初心者です。 A.jpg B.jpg C.jpg 例えば上記のようにサーバー上にある3つの画像ファイルからランダムに1ファイル抽出してそれを自動でD.jpgというファイル名に変換して(「D」はこちらで指定)サーバー上にアップロードすることは可能でしょうか?

専門家に質問してみよう