0

アップロード.php

<form enctype="multipart/form-data" action="uploader.php" method="POST">
Choose a file: <input name="uploadedfile" type="file" /><br />
Choose a file1: <input name="uploadedfile1" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

アップロード フォームのスクリーン キャプチャ

^ upload.php の画像^

アップローダー.php

<?php
mysql_select_db("test");

$target_path = "uploads/" . basename( $_FILES['uploadedfile']['name']);
$target_path1 = "upload1/" . basename( $_FILES['uploadedfile1']['name']);
$currentfile = $_FILES['uploadedfile']['name']; 
$currentfile1 = $_FILES['uploadedfile1']['name']; 

$dbfiles = mysql_query("SELECT * FROM new WHERE amount='$currentfile' || amount='$currentfile1'");
if(mysql_num_rows($dbfiles) > 0 )
{ 



}
else
{
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
        {
                echo "file1: ".$_FILES['uploadedfile']['name']."<br>";
                $file1 = basename( $_FILES['uploadedfile']['name']);
                mysql_query("insert into new (amount) values('$file1')");   
        }
        if(move_uploaded_file($_FILES['uploadedfile1']['tmp_name'], $target_path1))
        {
                echo "file2: ".basename( $_FILES['uploadedfile1']['name']);
                $file2 = basename( $_FILES['uploadedfile1']['name']);
                mysql_query("insert into new (amount) values('$file2')");   
        }
}
?>

導入と問題

このコードにより、ユーザーは 2 つのファイルをアップロードできるようになり、それぞれのファイル名が new( name of table ) に保存されます。ファイルのアップローダーであった履歴を取得し、簡単に取得できるように、テーブルに保存する必要があります。またはダウンロードしてください。最初のボタンはアップロードされたファイルで、ファイルはアップロードフォルダーに保存されます。次に、下のボタンは Uploadfile1 で、ファイルはupload1に保存されます。ユーザーがこの 2 つのボタンに 2 つのファイルを配置し、ユーザーが保存をクリックすると、ユーザーがuploaderfileまたはuploaderfile1のいずれかのボタンにファイルを1つだけ添付し、ファイルのアップロード/保存/送信をクリックすると、準備されたフォルダー(uploadsまたはupload1 )に保存されますが、そのファイル名はテーブルnewに保存されます次のフォルダーにファイルを保存します(uploads of upload1)。

問題は、ユーザーが同じファイル名をアップロードする場合です。たとえば、abc.jpg は既に新しいテーブルとフォルダー ( upload1 のアップロード) に存在しますが、一部のユーザーは abc.jpg もアップロードします。問題はフォルダーにあります( upload1 のアップロード) abc.jpg は 1 つ (1 個..) だけになります。なぜなら同じファイル名だからです.. 解決策は名前を変更することだと思います。現在アップロードされている abc.jpg は abc_1.jpg になり、テーブルの新しいabc_1.jpg が保存されます..

4

1 に答える 1

1

ファイルを元の名前で保存しないでください。

データベース内でファイルに一意の識別子を割り当て、この同じ識別子をファイル名に使用することをお勧めします。

次に、データベースからファイル パスと元の名前を取得し、readfile関連するヘッダーを設定してユーザーに送信するダウンロード ページを作成します。

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file_path));
ob_clean();
flush();
readfile($file_path);
die();

これは、ユーザーがサーバー上のファイルの場所を認識したり、アクセスしたりする必要がなくなるため、セキュリティの観点からも優れています。そのため、悪意のあるものをアップロードした場合、ファイルを直接呼び出すことができなくなります。

編集:

これを適用するには、自動インクリメント ID フィールドを持つファイル アップロード用のテーブルが必要です。

次に、元のファイル名とその他の関連情報を使用してデータベースに挿入できますmysql_query(例で既に使用しているため)。mysql_insert_id次に、挿入した行の一意の識別子を取得するクエリを渡す必要があります。これを使用してファイルに名前を付け、その後にアップロード フォルダー内の「.dat」拡張子を付けます。

ダウンロードに関しては、クエリ文字列または投稿パラメーターのいずれかで ID を受け取るダウンロード ページを用意し、これを使用してデータベース内の情報を検索します。これは最初に保存するために使用したものであるため、ID を指定してファイル名を特定できます。

ファイル パスと元の名前を取得したら、上記のコードを使用してユーザーにダウンロードを提示できます (別の名前を付けた場合は、置き換えた後、独自のパラメーター$file_name$file_location使用します)。

ダウンロード ページでは、ユーザーがファイルのダウンロードを許可されているかどうかのチェックも処理する必要があります。

于 2012-11-09T07:02:48.683 に答える