3

私がやろうとしていること:

file_get_contents()オンライン画像を新しいファイル名でサーバー上のディレクトリに保存します。保存パス/ディレクトリは書き込み可能です。CHMOD パーミッション: 777


私が試したこと:

  • file_put_contents($filepath, file_get_contents($image_url)); // 0KB の画像を保存

  • copy($image_url,$filepath); // 0KB の画像を保存

  • cURL // 0KB の画像を保存

だから、なぜこれがうまくいかないのか、なぜうまくいくべきなのか、すでに混乱しています...


私のPHPinfo内の関連する値は次のとおりです。

allow_url_fopen = On  
allow_url_include = On  
open_basedir = no value  

post_max_size = 8M  
upload_max_filesize = 50M  
upload_tmp_dir = no value  

max_execution_time = 18000  
max_file_uploads = 20  
max_input_nesting_level = 64  
max_input_time = 60  
max_input_vars = 1000  
memory_limit = 256M

そして、これが私の完全なPHPコードです(私は今、関数を使用して画像を保存しています。なぜなら、私は何でも試すのに十分必死だからです):

function save_image($inPath,$outPath)
{ // Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8388608))
    {
        fwrite($out, $chunk, 8388608);
    }
    fclose($in);
    fclose($out);
}

// THE ORIGINAL IMAGE TO GET
$image_url = 'http://m1.i.pbase.com/u38/antidote3/upload/31848351.Cute.jpg';

// THE IMAGE EXTENSION
$image_type = substr(strrchr($image_url,"."),1);

// THE NEW FILE NAME
$filename   = 'product5_'. md5($image_url . $sku).'.'.$image_type;

// THE SAVE PATH
// OUTPUT: /var/www/site/media/catalog/product/FILE_NAME.FILE_TYPE
$filepath   = Mage::getBaseDir('media') . DS . 'catalog'. DS . 'product'. DS . $filename;

// SAVE THIS BIATCH!
save_image($image_url, $filepath);

// OTHER SAVE METHODS
// file_put_contents($filepath, file_get_contents($image_url));
// copy($image_url,$filepath);

画像を実行strlen(file_get_contents($image_url))すると、大きな fat が返されます0
しかし、私のサーバーで以下を有効にするとうまくいきませんか?

allow_url_fopen = On  
allow_url_include = On

どうやら、問題は書き込みfile_get_contents($image_url)はありませんが、その中には何もありません。

理由はありますか?ありがとう!


その他の情報:

  • プラットフォーム:マジェント
  • 言語: PHP
  • PHP バージョン: 5.4.6
4

3 に答える 3

1

それが役立つかどうかはわかりません。この方法を試すことができますか?

function save_image($inPath,$outPath) {
  $inbuf = file_get_contents($inPath);
  $fp = fopen($outPath,'w');
  fwrite($fp,$inbuf);
  fclose($fp);
}

注: これはタイプミスで、$inbuf ではなく $buf でした。

于 2013-06-06T03:01:48.687 に答える
1

たぶん、次のようなことを試してみてください(feofとfreadを正しい方法で使用してください!)-拡張機能を取得する方法も変更しました:

<?php
function save_image($inPath, $outPath) {
  $in  = fopen($inPath,  "rb");
  $out = fopen($outPath, "wb");

  while (!feof($in)) {
    $read = fread($in, 8192);
    fwrite($out, $read);
  }

  fclose($in);
  fclose($out);
}

// THE ORIGINAL IMAGE TO GET
$image_url = 'http://m1.i.pbase.com/u38/antidote3/upload/31848351.Cute.jpg';

// THE IMAGE EXTENSION
$image_type = end(explode(".", $image_url));

// THE NEW FILE NAME
$filename   = 'product5_'. md5($image_url . $sku).'.'.$image_type;

// THE SAVE PATH
// OUTPUT: /var/www/site/media/catalog/product/FILE_NAME.FILE_TYPE
$filepath   = Mage::getBaseDir('media') . DS . 'catalog'. DS . 'product'. DS . $filename;

// SAVE THIS BIATCH!
save_image($image_url, $filepath);
?>
于 2013-06-06T02:59:30.673 に答える
0

答えは、サーバーのファイアウォール ルールが原因でした。助けてくれてありがとう!

于 2013-07-02T09:13:11.510 に答える