0

私はphpでファイルをアップロードしていますが、私の本当の問題は私がこのコードを持っていることなので、それは無関係です:

if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
$real = $_FILES['Filedata']['name'];
$finfo = pathinfo($real);
$time = time();
$rand1 = substr(sha1($real.$time),0,4);
$rand2 = substr(sha1($real.$time),5,-22);
$fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
mkdir(UPLOAD_TO."/".$rand2,0777);
$targetFile = UPLOAD_TO."/".$rand2."/".$real;
            move_uploaded_file($tempFile,$targetFile);
   $query = $db->prepare("INSERT INTO files (realname,filename,extension,filesize,rand1,rand2,uppedby,created) VALUES(:real,:filename,:extension,:filesize,:rand1,:rand2,:uppedby,:created)");
$query->execute(array(
":real" => $real,
":filename" => $fname,
":extension" => $finfo['extension'],
":filesize" => filesize($tempFile),
":rand1" => $rand1,
":rand2" => $rand2,
":uppedby" => $_SERVER['REMOTE_ADDR'],
":created" => time()
));

}

ファイルがアップロードされ、実際のタイムスタンプと実際のファイル名から sha1 ハッシュを作成しています。カットした後ですsubstr()が、難しい部分があります。mkdir は、切り捨てられた文字列ではなく、奇妙な別の組み合わせでディレクトリを作成しています。何が間違っているのかわかりません。よろしければご覧いただけますか?

4

1 に答える 1

1

$rand2 = sha1(sha1($real.$time),0,4);

これは$rand2 = substr(sha1($real.$time),0,4);#RAND2である必要があります

そして削除してください$do = ;

Under "dev mod" an error would show up:

Warning: sha1() expects at most 2 parameters, 3 given

タイプミスか何かがあるだけです

そのようなコードを使用してローカルサーバーを簡単にチェックしたところ、動作しました

<?php
DEFINE('UPLOAD_TO',"C:/env/php/www/tests/");
if (!empty($_FILES))
{
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $real = $_FILES['Filedata']['name'];
    $finfo = pathinfo($real);
    $time = time();
    $rand1 = substr(sha1($real.$time),0,4);
    $rand2 = substr(sha1($real.$time),5,-22);
    $fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
    mkdir(UPLOAD_TO."/".$rand2,0777);
    $targetFile = UPLOAD_TO."/".$rand2."/".$real;
    move_uploaded_file($tempFile,$targetFile);
}
?>
<form method="POST" enctype="multipart/form-data" action="">
    <input type="file" name="Filedata" />
    <input type="submit" />
</form>

あなたはそれをチェックすることができましたが、問題はあなたのsha1機能であり、substr

更新 2

フォルダ名に問題があり、その名前に不満があるため、次のように変更$rand2 = substr(sha1($real.$time),5,-22);してみてください。$rand2 = substr(sha1($real.$time),1,5);

php.net substrで substr のマニュアルを読み、ニーズに合わせてください。ちなみに、これは非常に基本的なものです。

substr の 3 つの引数は$STRING, $START and $LENGTH which is optional. からの抜粋はphp.net、あなたのためにそれをすべてクリアするかもしれません:

start が負でない場合、返される文字列は、string 内のゼロから数えて start 番目の位置から始まります。たとえば、文字列「abcdef」では、位置 0 の文字は「a」、位置 2 の文字は「c」などです。

私の意見では、次の部分はそれについてあなたの心をより明確にするでしょう(否定的な部分に注意してください)

length が指定され、正の場合、返される文字列には、(string の長さに応じて) start から最大で length 文字が含まれます。

length が指定され、負の場合、文字列の末尾からその数の文字が省略されます (start が負の場合、開始位置が計算された後)。start がこの切り捨ての位置またはそれ以降を示す場合、false が返されます。

于 2013-03-17T23:10:41.567 に答える