1

画像へのURLを指定して、ユーザーがファイルをアップロードできるようにしたい。

imgurとほとんど同じように、 http: //something.com/image.pngと入力すると、スクリプトがファイルをダウンロードし、サーバーに保存して公開します。

とを使っfile_get_contents()てみgetimagesize()ました。しかし、私は問題があるだろうと思っています:

  1. 大きな画像に100個のURLを提供する100人のユーザーからスクリプトを保護するにはどうすればよいですか?
  2. ダウンロードプロセスに時間がかかるのか、すでに時間がかかりすぎるのかを判断するにはどうすればよいですか?
4

2 に答える 2

1

これは実は面白いです。

cURL転送の進行状況を実際に追跡および制御できるようです。、およびに関するドキュメントを参照してください。CURLOPT_NOPROGRESSCURLOPT_PROGRESSFUNCTIONCURLOPT_WRITEFUNCTION

この例を見つけて、次のように変更しました。

<?php

file_put_contents('progress.txt', '');

$target_file_name = 'targetfile.zip';
$target_file = fopen($target_file_name, 'w');

$ch = curl_init('http://localhost/so/testfile2.zip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress_callback');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_callback');
curl_exec($ch);
if ($target_file) {
    fclose($target_file);
}

$_download_size = 0;
function progress_callback($download_size, $downloaded_size, $upload_size, $uploaded_size) {
    global $_download_size;
    $_download_size = $download_size;
    static $previous_progress = 0;

    if ($download_size == 0) {
        $progress = 0;
    }
    else {
        $progress = round($downloaded_size * 100 / $download_size);
    }

    if ($progress > $previous_progress) {
        $previous_progress = $progress;
        $fp = fopen('progress.txt', 'a');
        fputs($fp, $progress .'% ('. $downloaded_size .'/'. $download_size .")\n");
        fclose($fp);
    }
}

function write_callback($ch, $data) {
    global $target_file_name;
    global $target_file;
    global $_download_size;

    if ($_download_size > 1000000) {
        return '';
    }
    return fwrite($target_file, $data);
}

write_callbackデータのサイズが指定された制限より大きいかどうかを確認します。そうである場合は、転送を中止する空の文字列を返します。これを、それぞれ80Kと33Mの2つのファイルでテストしましたが、制限は1Mです。あなたの場合、progress_callback2行目以降は無意味ですが、デバッグのためにすべてをそこに保持しました。

データのサイズを取得するもう1つの方法は、リクエストを実行することですが、サーバーがヘッダーHEADを送信する必要はないと思います。Content-length

于 2012-09-04T19:52:35.550 に答える
0

質問1に答えるには、コードに適切な制限を追加するだけです。特定の時間内に受け入れるリクエストの数を定義し、データベースでリクエストを追跡して、そこから移動します。また、ファイルサイズに上限を設けます。

質問2では、cURLを使用する場合、適切なタイムアウトを設定できます。

于 2012-09-04T18:49:47.630 に答える