2016-07-24 2 views
1

Я пытаюсь создать новую папку в папке для загрузки, чтобы пользователь мог загружать файл на свою собственную папку. Могу ли я сделать это с помощью PHP или мне нужен столбец «LONGBLOB» в MYSQL? Я читал, что это не хорошая практика для хранения изображений в вас базе данныхЗагрузить файлы в папку пользователя

<?php 
header('Content-Type: application/json'); 

$succeeded = []; 
$failed =[]; 
$uploaded = []; 
$allowed = ['png', 'gif', 'jpg']; 

if(!empty($_FILES["file"])) { 

    foreach ($_FILES['file']['name'] as $key => $name) { 
     if ($_FILES['file']['error'][$key] === 0) { 

      $temp = $_FILES['file']['tmp_name'][$key]; 

      $ext = explode('.', $name); 

      $ext = strtolower(end($ext)); 

      $file = md5_file($temp) . time() . '.' . $ext; 

      if (in_array($ext, $allowed) === true && move_uploaded_file($temp, "uploads/{$file}") === true) { 
       $succeeded[] = array(
           'name' => $name, 
           'file' => $file 
           ); 

      }else{ 
       $failed[] = array(
        'name' => $name); 
      } 
     } 
    } 


} 

if (!empty($_POST['ajax'])) { 
    echo json_encode(array(
     'succeeded' => $succeeded, 
     'failed' => $failed)); 
} 



?> 
+0

Вы можете легко создать папку для каждого пользователя с помощью PHP и лучший подход, чем дб - возможно сохранить ссылку на файл в БД и какое-то хэш для использования в ссылках для загрузки возможно. На самом деле хранение изображений в виде BLOBS в db приведет к тому, что он вырастет до, возможно, огромного размера – RamRaider

ответ

0

Если у вас есть имя или идентификатор пользователя в переменной сеанса, то, что можно было бы использовать в качестве основы для новой папки, в которую он/она будет загружать файлы. Неизменно то же имя пользователя, идентификатор должен использоваться, когда они хотят загрузить файл. Сохраняя хэш и путь к файлу, вы можете создавать ссылки, которые не отображают имя файла, путь к папке, владелец и т. Д., Поскольку db может проверять золу и возвращать файл и путь, когда это необходимо.

Ниже приведен непроверенный пример создания собственной папки пользователя и использования этого в процессе загрузки - надеюсь, что это даст вам некоторые идеи/рекомендации.

<?php 


    $succeeded = []; 
    $failed =[]; 
    $uploaded = []; 
    $allowed = ['png', 'gif', 'jpg']; 


    /* 
     generate a suitable name for the new folder, 
     remove characters which might be troublesome 
    */ 
    $userdir = str_replace( 
     array("'",'"','-'), 
     array('','','_'), 
     $_SESSION['username'] 
    ); 



    /* 
     new path into which the files are saved 
     It might be better to have the files 
     stored outside of the document root. 
    */ 
    $savepath = 'uploads/' . $userdir; 



    /* create the folder if it does not exist */ 
    if(!file_exists($savepath)) { 
     mkdir($savepath); 
     chown($savepath, $username); 
     chmod($savepath, 0644); 
    } 



    if(!empty($_FILES["file"])) { 

     foreach($_FILES['file']['name'] as $key => $name) { 
      if($_FILES['file']['error'][$key] === 0) { 

       $temp = $_FILES['file']['tmp_name'][$key]; 

       /* 
        is there anything to be gained by hashing the filename? 
        the hash would be the same for filenames with the same 
        name anyway. 

        If the file is large, calculating the hash of the file could 
        take some time... 
       */ 
       $ext = explode('.', $name); 
       $ext = strtolower(end($ext)); 
       $file = md5_file($temp) . time() . '.' . $ext; 


       /* generate a random hash to use in downloads */ 
       $hash=uniqid(md5(date(DATE_COOKIE))); 


       /* here probably - store reference in db? Assign permissions based upon owner etc */ 
       $sql='insert into `table` (`filename`,`username`,`uid`,`datetime`,`hash`) values (?,?,?,?,?);';    

       /* bind params and execute - not shown */ 



       if (in_array($ext, $allowed) === true && move_uploaded_file($temp, "{$savepath}/{$file}") === true) { 
        $succeeded[] = array('name' => $name, 'file' => $file); 
       }else{ 
        $failed[] = array('name' => $name); 
       } 
      } 
     } 
    } 

    if (!empty($_POST['ajax'])) { 

     header('Content-Type: application/json'); 
     echo json_encode(array(
      'succeeded' => $succeeded, 
      'failed' => $failed)); 
    } else { 

     header('HTTP/1.1 404 Not Found', true, 404); 
    } 
?>