0

fopen、fwrite を使用して、外部サーバーからサーバー上のフォルダーにファイルを保存したいと考えています。

まず、外部サイトのページが読み込まれ、画像リンクがスキャンされます。次に、そのリストが an から fwrite 関数に送信されます。ファイルは作成されますが、有効な jpg ファイルではありません。ブラウザで表示すると、サーバー上のパスが書き込まれているように見えます。

コードは次のとおりです。

//read the file
$data = file_get_contents("http://foo.html");

   //scan content for jpg links
preg_match_all('/src=("[^"]*.jpg)/i', $data, $result); 

//save img function
function save_image($inPath,$outPath)
{
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

//output each img link from array
foreach ($result[1] as $imgurl) {
    echo "$imgurl<br />\n";
    $imgn = (basename ($imgurl));
    echo "$imgn<br />\n";
    save_image($imgurl, $imgn);
}

リストを書き出すと、save_image関数が機能します。

save_image('http://foo.html', foo1.jpg);
save_image('http://foo.html', foo1.jpg);

配列内の一致からリストをループできることを望んでいました。

ご覧いただきありがとうございます。

4

4 に答える 4

1

スクリプトには 2 つの問題があります。まず、引用符が外部画像 URL に含まれています。これを修正するには、正規表現を次のようにする必要があります。

/src="([^"]*.jpg)/i

次に、画像の URL はおそらく絶対的ではありません (http:// とファイル パスを含めないでください)。これを foreach の先頭に配置して修正します。

$url = 'http://foo.html';
# If the image is absolute.
if(substr($imgurl, 0, 7) == 'http://' || substr($imgurl, 0, 8) == 'https://')
{
  $url = '';
}
# If the image URL starts with /, it goes from the website's root.
elseif(substr($imgurl, 0, 1) == '/')
{
  # Repeat until only http:// and the domain remain.
  while(substr_count($url, '/') != 2)
  {
    $url = dirname($url);
  }
}
# If only http:// and a domain without a trailing slash.
elseif(substr_count($imgurl, '/') == 2)
{
  $url .= '/';
}
# If the web page has an extension, find the directory name.
elseif(strrpos($url, '.') > strrpos($url, '/'))
{
  $url = dirname($url);
}
$imgurl = $url. $imgurl;
于 2011-03-06T23:17:14.883 に答える
0

fopen の動作は保証されていません。エラー時に別のものを返す可能性のあるものの戻り値を確認する必要があります...

fopen()- 成功した場合はファイル ポインタ リソースを返し、エラーが発生した場合は FALSE を返します。

実際、すべてのファイル関数はエラー時に false を返します。

どこで失敗しているかを把握するには、デバッガーを使用するか、save_image 関数でいくつかの情報を出力することをお勧めします。つまり、$inPath と $outPath が何であるかを調べて、期待どおりに渡されていることを検証できます。

于 2011-03-06T22:46:49.507 に答える
0

私が見る主な問題は、正規表現が完全なhttp://パスをキャプチャしない可能性があることです。ほとんどのサイトはこれをオフのままにし、相対パスを使用します。そのためのチェックをコーディングし、存在しない場合は追加する必要があります。

于 2011-03-06T22:47:40.017 に答える
0

あなたのマッチには src ビットが含まれているので、代わりにこれを試してください:

preg_match_all('/(?<=src=")[^"]*.jpg/i', $data, $result); 

そして、これはうまくいくはずだと思います:

unset($result[0]);
//output each img link from array
foreach ($result as $imgurl) {
    echo "$imgurl<br />\n";
    $imgn = (basename ($imgurl));
    echo "$imgn<br />\n";
    save_image($imgurl, $imgn);
}
于 2011-03-06T22:50:27.160 に答える