Лучший способ хранить несколько загруженных файлов в базе данных - PullRequest
0 голосов
/ 02 августа 2011

В настоящее время у меня есть форма загрузки PHP, которая позволяет пользователям загружать несколько файлов. Это внутренний скрипт, который загружает файлы.

while(list($key,$value) = each($_FILES[images][name]))
{
if(!empty($value)){   // this will check if any blank field is entered
$filename = $value;    // filename stores the value


$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line


$file_ext = @strtolower(@strrchr($filename,"."));
$file_ext = @substr($file_ext, 1); // remove dot
$filename = md5(uniqid(rand(), true)) . '.' . $file_ext;


$add = "/html/uploaded/$filename";   // upload directory path is set
copy($_FILES[images][tmp_name][$key], $add);     //  upload the file to the server
chmod("$add",0777); 

}
}

После этого цикла while я запускаю SQL-запрос, чтобы вставить информацию в мою базу данных. Как я могу убедиться, что первый первый файл хранится как $ file1, а второй как $ file2 и т. Д.

Я попытался подсчитать цикл, чтобы выяснить, какой номер файла был, но он не работал.

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Хранение файлов в базе данных обычно считается плохой идеей.Вам лучше обслужить, поместив файлы на локальный диск сервера и сохранив вместо этого имя файла в базе данных.

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

У вас есть несколько структурных проблем с вашим кодом.Попробуйте этот код:

$errors = array();
$files = array();
foreach ($_FILES['images'] as $k=>$image) {

    // handle upload errors
    if ($image['error'] != 0 && $image['error'] != 4) {         
        switch ($image['error']) {
            case '1':
            case '2':
                $err = 'The uploaded file exceeds the maximum file size.';
                break;                  
            case '3':
                $err = 'The upload was inturupted, transfer failed.';
                break;
            case '6':
            case '7':
            case '8':
                $err = 'Server error.  Please try again later.';
                break;
        }
        // record error and move on
        $errors[] = array('image'=>$k, 'error'=>$err);
        continue;
    } elseif ($image['error'] == 4) {
        // error 4 means no image was sent
        continue;
    }

    // determine the extension
    $ext = explode('.', $image['name']);
    if (count($ext) != 2) {
        $errors[] = array('image'=>$k, 'error'=>'Could not determine file extension.');
        continue;
    } else {
        switch ($ext[1]) {
            case 'jpg':
            case 'jpeg':
            case 'gif':
            case 'png':
                break;
            default:
                $errors[] = array('image'=>$k, 'error'=>'Unsupported file extension.');
                continue;
                break;
        }
    }

    // make a random-ish filename
    $filename = time().uniqid(rand(), true) . '.' . $ext[1];
    $path = '/html/uploaded/'.$filename;   // upload directory path is set

    move_uploaded_file($image['tmp_name'], $path);     //  upload the file to the server
    // this is a bad idea right here! Use 775 at least, if possible
    chmod($path,0777);
    $files[] = array('name'=>$filename, 'path'=>$path);
}

// now loop the $files array and put the paths into the database

// you also should do something with the errors listed in $errors

РЕДАКТИРОВАТЬ

Итак, вот быстрый и грязный пример помещения этих файлов в базу данных.Хочу заметить, что у вас есть поля size и ext - если предполагается, что для записи файла и расширения изображения ... какое?В любом случае, если вы заполните другие переменные, приведенный ниже код поместит имена файлов в БД.

Я хотел бы посоветовать вам - у этой базы данных есть недостатки.Что делать, если вы хотите более 5 изображений?Вам придется изменить структуру таблицы БД И отредактировать код.Гораздо лучше, если создать структуру реляционной таблицы, в которой вы вставляете одну строку для каждого файла с идентификатором, чтобы связать их все вместе (т.е. album_id, тогда у вас есть таблица с именем albums с информацией верхнего уровня в ней).

// start building up the SQL query, start with
// some fields that are straightforward
$sql = '
    INSERT INTO table_name (
        `id`,
        `status`,
        `user`,
        `title`,';

// now loop the list of files (5 only), 
// add each needed field
for ($i=1; $i < count($files) && $i < 5; $i++) {
    $sql .= '`file'.$i.'`,';
}

// build out the rest of the query, add values
// for the straightforward fields
$sql .= '
    `size`,
    `ext`,
    `ip`,
    `date`
) VALUES (
    NULL, 
    "'.$status.'",
    "'.$user.'",
    "'.$title.'",
';

// loop the files
$ct = 1;
foreach ($files as $f) {
    $sql .= '"'.$f['name'].'",';
    // only allow 5 files
    if ($ct == 5)
        break;
    $ct++;
}

// wrap up building the query
$sql .= '
    "'.$size.'",
    "'.$ext.'",
    "'.$ip.'",
    "'.$date.'"
)';

mysql_query($sql);
1 голос
/ 02 августа 2011

Прежде всего, вы должны использовать апострофы при доступе к ассоциативным массивам, таким как $ _FILES в вашем цикле for.

Относительно вашей проблемы: почему бы не использовать что-то вроде $filename = sprintf('%s%d.%s', md5(uniqid(rand(), true)), $key, $file_ext); вместо $filename = md5(uniqid(rand(), true)) . '.' . $file_ext;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...