2017-01-16 26 views
0

ログインしたユーザーがファイルをカスタムフォルダ(uploads/users/username /)にアップロードできるようにファイルアップロードフォームを作成しました。アップロードファイルに削除ボタン(リンク解除)を追加する

以下のコードは、ユーザーがアップロードしたすべてのファイルを示していますが、私は各項目に「削除」ボタンを追加するのに苦労しています。これは登録のない厳密に管理されたウェブサイトであり、パブリックドメイン用ではないため、セキュリティは最大15〜20人のユーザーのみが使用するため、セキュリティは大きな問題ではありません。

私はリンクをきちんと追加するのに苦労しています。私は、オンラインで見られる様々な提案を試みたが、運と、私はそれのようなものになるはずだと思う:

<?php 
$dir_open = opendir('uploads/users/' . $_SESSION['username'] . ''); 
while(false !== ($filename = readdir($dir_open))){ 
    if($filename != "." && $filename != ".."){ 
      $fullpath = "uploads/users/" . $_SESSION['username'] . "/$filename"; 
      echo "<a href='$fullpath' target=\"_blank\"><img src='$fullpath' style='width:350px;border: 1px solid #000;'></a><br /> 
        $filename<br /> 
Delete button--> <a href="$fullpath">Delete file</a> 
        <hr><br />"; 
}}closedir($dir_open); 
?> 

をすべてのヘルプは大幅にあなたがする必要がある、各ファイルの削除ボタンを作成するには

答えて

0

をいただければ幸いですアップロード機能を作成したときにその情報をdbに保存したと仮定して、ファイルへのIDとパスを取得します。だから、例は次のようになります。

<?php 
//... 
$db = new PDO('mysql:host=127.0.0.1;dbname=db_name','db_user','db_pass'); 
$stmt = $db->prepare('SELECT id,filename FROM your_table'); 
while ($row = $stmt->fetch()){ 
?> 
    <a href="delete.php?id=<?php echo $row['id']; ?>">Delete</a> 
<?php 
} 
?> 

その後、delete.phpファイルに:私は正確に何をしたいかわからないよう

if (isset($_GET['id']) && is_numeric($_GET['id'])) { 
    //db connect here 
    $stmt = $db->prepare('DELETE FROM table_name WHERE id=?'); 
    $stmt->execute([$_GET['id']); 
} 

セキュリティに関しては、私は、あなたについて多くを語ることはできません。しかし、あなたはmimeのタイプを調べることができます(そして、必要なMIMEタイプのみを許可する)、ファイルサイズについて(特定のファイルサイズのみを許可する、または0サイズのファイルを許可しないようにする)ことができます。ちょうどGoogleを検索し、この件に関する良いチュートリアルがたくさんあります。

アップロードしたすべてのファイルを一覧表示するには、ユーザーごとにdbも使用できます。

LE

[OK]を、私はあなたの問題について少し掘って、私は最終的に、ユーザーがファイルを削除できるようにする方法を見つけました。しかし、私はいかなる種類のセキュリティも考慮に入れなかったことに注意してください。あなたにもこの質問がありますが、それはあなたの責任です。

ように、コードは次のようになります。私は、コードを試す前chmod 777 -R files/を使用

//index.php 
$files = scandir('files'); 
foreach ($files as $file){ 
    if (is_file('files/'.$file)){ 
     ?> 
     <a href="index.php?remove=<?php echo $file; ?>">delete</a> <br> 
     <?php 
    } 
} 

if(isset($_GET['remove'])){ 
    unlink('files/'.$_GET['remove']) ? header('Location: index.php') : print 'Not Removed<br>'; 
} 

。これが良いアプローチであるかどうかは本当に分かりません。

LE2

私はこの例のために使用されてきたディレクトリ構造:

project/ 
    files/ 
     1.php 
     2.html 
     3.css 
     4.js 
    index.php 

これらのファイル(1.php2.html、など)をお使いのアップロード機能によってそこに配置されている、あなたが言いましたあなたはすでに持っています。 index.phpまず、files/ディレクトリを配列として読み込みます(ファイル名のみを含む)。配列を繰り返し処理し、配列の各要素がファイルであるかどうかを確認し、存在する場合はリンクを生成し、ユーザをindex.phpにリダイレクトしますが、今回はクエリ文字列(例:index.php?remove=1.php )。最後に、removeという名前のクエリ文字列があるかどうかを確認し、存在する場合はそれぞれのファイルを削除し、index.phpにリダイレクトします。

+0

こんにちはダン、私はすでに '$ fullpath'に完全なファイルパスを持っています。私はファイルのためにデータベースを使用していないので、なぜ私は 'unlink()'がこれと一緒に行く方法だと信じています。私は私のイントラネットで自宅で使用する同様のセットアップを持っていますが、それはすべてのログイン/ファイルを処理するためにdbであらかじめ構築されたシステムを使用していますが、この場合は私が作業しているウェブサイトとしては適切ではありません1 dbに制限されており、すでに使用されています。私はこれがデータベースなしで行うことができることを知っているが、私はGoogleの最初の5ページですべての単一の結果を読んだことがあり、 – noozl

+0

@noozl私のLEを見てください。 –

+0

私はまだ私の現在のコードでそれを実装することはできません。私はPHPでそれほど偉大ではないので、少し苦労しています。どこにポインタを置くの? – noozl

0
I think what you need is make sure that when saving the file, you create a unique name to save the file by changing the file name to something of such 
    <?php 
    $fileExtension = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION); 
    $filename=uniqid('upload_').rand(10000,9999999).date('ymdHis').rand(10000,9999999).'.'.$fileExtension; 
?> 

    use this as the file name (containing the name and the extension) you are saving to ur db and move the file to a folder. 

    To delete, the delete.php will pass the filename as a get method or using ajax to send the file name to your delete.php 

    such that in delete.php, you will then 

    `1. query to delete the file using filename from db 
    2. if success, then use the unlink to delete from path such that you do something of this nature 
    <?php 
    unlink(Path_of_uploaded_files/filename); 
?> 

    I can provide an example later. 
関連する問題