2017-11-15 21 views
1

ファイル(画像)をアップロードするPHP機能があります。PHP画像アップロード名は変更されません

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) 
{ 
    $file_name = $_FILES['wallpaperFile']['name'][$key]; 
    $file_type = $_FILES['wallpaperFile']['type'][$key]; 
    $file_size = $_FILES['wallpaperFile']['size'][$key]; 
    $file_tmp = $_FILES['wallpaperFile']['tmp_name'][$key]; 

    move_uploaded_file($file_tmp,"assets/img/wallpapers/".time().$file_name); 
} 

私は自分のフォルダにアップロードされたデータイメージを見ることができます。

しかし、私は.$file_nameを削除した場合、今どのように私は、画像のファイル名を設定することができる唯一のtime()

.$file_nameせず、ファイルのアップロードは、私は3つのファイルをアップロードしていても、拡張子のみ1ファイルがないと正しくありません。

例:

画像ファイル名:1510750186shubuh.jpg

私だけ

1510750186.jpg

+0

「test/123456」のようなパスには注意してください。パス区切り文字が\に変更された場合、 '\ 1 '(または別の数字)は特殊文字として解釈される可能性があるため、予期しない動作が発生する可能性があります。このようなことを避けるには 'test/img-12345'のようなパスを使うことができます。 (*私はこれにいくつかの経験をした*) –

答えて

2

をしたい何をPATHINFO_EXTENSIONフラグで、このためにpathinfo()を使用することができます、Like:

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) 
{ 
    $file_name = $_FILES['wallpaperFile']['name'][$key]; 
    $file_type = $_FILES['wallpaperFile']['type'][$key]; 
    $file_size = $_FILES['wallpaperFile']['size'][$key]; 
    $file_tmp = $_FILES['wallpaperFile']['tmp_name'][$key]; 
    $ext = pathinfo($file_name, PATHINFO_EXTENSION); 

    move_uploaded_file($file_tmp,"assets/img/wallpapers/".time().'.'.$ext); 
} 

これは拡張子のみを追加し、完全なファイル名は追加しません。

編集:

これらの1を使用しようと、同時に複数のファイルをアップロードするには:

$newFileName = time()."{$key}.{$ext}"; 
move_uploaded_file($file_tmp,"assets/img/wallpapers/".$newFileName); 

それとも

$newFileName = str_replace('.','',microtime(true)).".{$ext}"; 
move_uploaded_file($file_tmp,"assets/img/wallpapers/".$newFileName); 
0

私は拡張子とは思いませんファイルの問題がここにあります。 time()には1秒の解像度しかありません。ループの繰り返しでtime()の値が異なる可能性は非常に低いです。そのため、すべてのファイルの名前はtime()となります。

マイクロ秒の忠実度を持つmicrotime(true)、または同じ要求でより高い解像度を得るにはuniqid()のようなものを使用する方が良いでしょう。

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) 
{ 
    $file_name = $_FILES['wallpaperFile']['name'][$key]; 
    $file_type = $_FILES['wallpaperFile']['type'][$key]; 
    $file_size = $_FILES['wallpaperFile']['size'][$key]; 
    $file_tmp = $_FILES['wallpaperFile']['tmp_name'][$key]; 

    /* user either this */ 
    move_uploaded_file($file_tmp,"assets/img/wallpapers/" . microtime(true)); 

    /* or this */ 
    move_uploaded_file($file_tmp,"assets/img/wallpapers/" . uniqid()); 
} 

あなたは、単にtime()ここにあなたの要件にもたらすであろうと問題点を実現するためにそのループ内time()microtime(true)の両方の値を印刷して違いを見ることができます。

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) 
{ 
    echo "time(): ", time(), "<br>\n"; 
    echo "microtime(true): ", microtime(true), "<br>\n"; 
    echo "uniqid(): ", uniqid(), "<br>\n"; 
} 

それはユーザ提供の入力であり、そのようなものとして、それは操作に対して脆弱であるため、あなたはは、ここに$_FILES['wallpaperFile']['name']を頼るべきではありません

警告。このベクトルを介してクライアントに直接アクセスすることで、クライアントがあなたのファイルシステムを悪用/操作する可能性を避けてください。あなたのファイルシステム上に完全にランダムなファイル名を持ち、そのランダムな名前をあなたのデータベースに格納して任意のユーザ指定の入力と関連付けることは好ましいことです。サーバーのファイルシステムを完全に制御しながらユーザーが自分のデータを制御できるようにします。

関連する問題