2

アップロード時にファイルが存在するかどうかを確認する機能の追加についてサポートが必要です。

アップロード用のupload.phpコードは次のようになります。

$file_name = $HTTP_POST_FILES['ljudfil']['name'];
$random_digit=rand(0000,9999);
$mp3 ='.mp3';
$pdf ='.pdf';
$datum = date('Ymd'); 
$new_file_name=$random_digit.$file_name;
$target_path1 = $target_path . $orgnr . '_' . $gsm . $pdf; 

$target_path3 = $target_path . 'AC' . $datum . $new_file_name . $mp3; 
$target_path11 = $target_path4 . $orgnr . '_' . $gsm . $pdf; 

$target_path33 = $target_path4 . 'AC' . $datum . $new_file_name . $mp3;
$targetljudfilftp = 'AC' . $datum . $new_file_name . $mp3;

move_uploaded_file($_FILES['avtalsfil1']['tmp_name'], $target_path1);
move_uploaded_file($_FILES["ljudfil"]["tmp_name"], $target_path3);
$sql = "INSERT INTO affarer (tid, cid, orgnr, ljudfilftp) VALUES 
        (CURDATE(),'$date','$cid','$orgnr', '$targetljudfilftp')";

ご覧のとおり、乱数を含むアップロードされたファイルの名前を変更します。

場合によっては、ファイルの名前が既に存在する番号に変更されることがあります。

その場合、サーバー上の以前のファイルが上書きされます。

では、名前の変更に使用する前にターゲット名が存在するかどうかを確認する関数を追加するにはどうすればよいでしょうか?

4

6 に答える 6

0
if (file_exists($random_digit)) {
   $random_digit = rand(0000,9999);
}
于 2012-11-19T12:06:23.953 に答える
0

使用できます

if (file_exists($target_path1))

ファイルが存在するかどうかを確認します。

ただし、戦略を変更して採用する方がよいでしょうtempnam

$target_path  = tempnam ($target_path, 'AC' . $datum . $file_name . $mp3)

これにより、「AC_2012_Anacreon.mp3_xTfKxy」などのファイルが作成されますが、一意であることが保証されますが、使用してもfile_exists同時実行の衝突のリスクにさらされます。

もちろん、ファイルには拡張子が付いていない.mp3ため、ディレクトリをスキャンしてダウンロード用のファイルを提供するときは、拡張子を考慮する必要があります。

まだ安全ではありませんが、おそらくより簡単な方法は次のとおりです。

for(;;)
{
    $newname = // some strategy to generate newname, including a random
    if (!file_exists($newname))
        touch($newname);
    if (!filesize($newname))
        break;
}

または、lockファイルを使用して同時実行がないことを保証できます (したがって、それfile_existsは真実を返し、真実のままになります)。

$fp = fopen('.flock', 'r+');
if (flock($fp, LOCK_EX))
{
    for(;;)
    {
        $newname = // some strategy to generate newname, including a random
        if (!file_exists($newname))
        {
            // this creates the file uniquely for us.
            // all other writers will find the file already there
            touch($newname);
        }
    }    
    flock($fp, LOCK_UN);
}
else
    die("Locking error");
fclose($fp);
// $newname is now useable.
于 2012-11-19T12:06:44.653 に答える
0

重複した数値を生成できる「rand」関数を使用する代わりに、「uniqid」php 関数を使用できます。これは一意の ID ( http://www.php.net/manual/en/function.uniqid.php ) を返します。

それでも「rand」を使用したい場合は、生成されたファイル名をパラメーターとして「file_exists」関数を使用できます ( http://www.php.net/manual/en/function.file-exists.php )。ファイルが存在する場合は、ファイル名を再生成する必要があるため、ファイルが存在するたびに反復します。

最後に、off date('Ymd') の代わりにフルタイムの date('Ymdhis') 形式を使用することを考えてください。また、time() 関数を呼び出してタイムスタンプを使用することをお勧めします ( http://www.php.net/manual/en /function.time.php )

アナス、

于 2012-11-19T12:03:31.190 に答える
0

以下のように使用できます

$random_digit = time();

于 2012-11-19T11:56:45.397 に答える
0

(たとえば)時間ベースの方法を使用して、ランダム ダイジェストの作成方法を変更できます。

$random_digit = microtime(TRUE);

于 2012-11-19T11:55:33.820 に答える
0

file_exists組み込み関数を使用します。

于 2012-11-19T11:54:58.597 に答える