2011-08-11 7 views
1

次のスクリプトを使用しています。それは基本的にアップロードされているファイルの名前が既に存在するかどうかをチェックし、そうであればそれを別の名前に変更してアップロードする必要があります。これまでのところそれは動作しません。いずれかのファイルの名前を変更するか、私はそれが破損したファイルを言うWebページを介してファイルを開くしようとすると。名前が既に存在する場合、ファイルの名前を変更するにはどうすればよいですか?

コード:あなたは既にデータベースを使用している

$sql="SELECT filename FROM doc_u WHERE person_id= '$pid'"; 

    $result=mysql_query($sql); 

    $query = mysql_query($sql) or die ("Error: ".mysql_error()); 

if ($result == "") 
{ 
echo ""; 
    } 
    echo ""; 


    $rows = mysql_num_rows($result); 

    if($rows == 0) 
    { 
    print(""); 

    } 
    elseif($rows > 0) 
    { 
    while($row = mysql_fetch_array($query)) 
    { 

    $existing = $row['filename']; 

    print(""); 
    } 

    } 

    if ($filename === $existing) { 
$filename = $uniqueidgenerator.strrchr($_FILES['filename']['name'], "."); 

    } else { 
    $filename = $_FILES['filename']['name'];; 
    } 

//After checking it will move the files

 if(move_uploaded_file($_FILES['filename']['tmp_name'],$upload_path . $filename)) 
    echo ''; 
    else 
    echo ''; 

答えて

2

を考えると、私はasplainlyできるだけそれを言わせて:ユーザー提供のファイル名を使用することはありません。代わりに、アップロードされた各ファイルを対応するDBレコードのプライマリ・キーID番号(idsの自動インクリメント整数を使用していますか?)で保存します。実際のファイルの名前はそれぞれ「1」、「53」、「207」などとなるので、データベースのファイル名をデータベースに保存して、必要な数のtext.txtファイルを作成できます。

+1

これは非常に重要です。誰かにsomejpeg.phpをあなたのサーバにアップロードさせると、それはjpegとして検証されるかもしれませんが、それ自体の中に悪質なコードが残っています。誰かが基本的にこの方法を使用してサーバーを引き継ぐことができます。 – dqhendricks

+0

okですので、ファイル名を取り出してdbに保存し、アップロードされているファイルの名前を変更するようにしてください。そしてあなたがそれをユーザーに提供するとき、私たちがそれに与えた一意のファイル名を持ちます。しかし、ユーザーがアップロードした名前でファイルを取得できないことは悪いことではありません... – KPO

+1

あなたはPHP経由でファイルを提供し、 'header( 'Content-disposition:attachment; filename = ORIGINAL_FILENAME_HERE')を出力します。 ;そして、あなたのサーバー上で実際に '207'と呼ばれることはありません。 –

1

ここに行くコードはあまりありません。 $filenameが正しく初期化されていないと思われます。あなたのif ($filename === $existing)では、実際には常にif(undefined === undefined)と言っています。

ファイルが破損する理由はわかりません。それはまったく別の問題かもしれません。

また、SQL文には注意してください。それは起こるのを待っているSQLインジェクションです。準備されたステートメントを使用した場合や、少なくともmysql_escape_stringを使用した方がずっと良いでしょう。これはもちろん、準備された声明を支持して非難されています。

より良いワークフローは、最初にファイルのメタデータを含む行をデータベースに挿入し、戻った主キーを使用してファイルの名前を変更することです。常にユニークであることが保証されています。

関連する問題