3

ファイルアップローダーがあり、ファイル名に番号を自動的にインクリメントさせたい。これを行うためにデータベースを使用する必要はないと感じており、コードを比較的クリーンに保ちたいと思っています。PHPでのファイルのアップロードと管理はかなり新しいので、どうすればよいか正確にはわかりません。誰かが私を正しい道に導くことができますか?

これが私の現在のコードです。シードの束のmd5を使用しています。

<?php
if(isset($_FILES['imagedata']['tmp_name']))
{
// Directory related to the location of your gyazo script
    $newName = 'images/' . substr(md5(rand() . time()), 0, 20) . '.png';
    $tf = fopen($newName, 'w');
    fclose($tf);
    move_uploaded_file($_FILES['imagedata']['tmp_name'], $newName);
// Website
    echo 'http://davidknag.com/' . $newName;
}
?>
4

5 に答える 5

3
<?php
if(isset($_FILES['imagedata']['tmp_name'])) {
    // Directory related to the location of your gyazo script
    $fileCount = count (glob ('images/*.png'));
    $newName = 'images/' . ( $fileCount + 1) . '.png';
    $tf = fopen($newName, 'w');
    fclose($tf);
    move_uploaded_file($_FILES['imagedata']['tmp_name'], $newName);
    // Website
    echo 'http://davidknag.com/' . $newName;
}

ディレクトリ内のすべての.pngファイルをカウントし、その数を1ずつ増やし、それをファイル名として使用します。

非常に大量のファイル(たとえば10.000)を保存している場合は、Joseph Lustsの方法を使用する方が高速ですが、それ以外の場合は問題なく機能します。

于 2012-05-19T19:54:35.353 に答える
2

指定されたフォルダに基本的なテキストファイルを置くことができます。そこに番号を保存します。それを読み、必要に応じてインクリメントします。

上記を実行するgetNextNumber()のような関数を作成するのが最も簡単で、必要に応じて使用できます。$ _SERVER []変数でこれを行うこともできますが、サーバーの再起動時にファイルから再ロードする必要があります。

<?PHP
// a basic example
function getNextNumber() {
    $count = (int)file_get_contents('yourFile.txt');
    $count+=1;
    file_put_contents('yourFile.txt',$count);
    return $count;
}

?>

これを大量に使用している場合は、呼び出しごとに2つのファイルIOを実行するため、より高度なシーケンスジェネレーターが必要になることに注意してください。

于 2012-05-19T19:53:07.057 に答える
1

以下のコードを試すことができます。outdir/ に .png 拡張子と一意の名前を持つファイルを作成します。

$filename = uniqFile('outdir', '.png');
move_uploaded_file($_FILES['imagedata']['tmp_name'], $filename);


function uniqFile($dir, $ext)
{
    if (substr($dir, -1, 1) != '/')
    {
        $dir .= '/';
    }

    for ($i=1; $i<999999; $i++)
    {
        if (!is_file($dir . $i . $ext))
        {
            return $i . $ext;
        }
    }
    return false;
}
于 2012-05-19T20:21:21.247 に答える