загрузить несколько файлов на сервер и записать в базу данных - PullRequest
0 голосов
/ 11 ноября 2011

Так что на данный момент у меня есть следующий код в моем HTML <input type="file" required required="required" name="image" multiple="">

и затем, прежде чем я добавил тег mutliple="", это всегда работало для меня,

if(isset($_POST['Submit']))
{
$current_image=$_FILES['image']['name'];
$extension = substr(strrchr($current_image, '.'), 1);
if (($extension!= "png") && ($extension != "jpg")) 
{
die('Unknown extension');
}
$time = date("fYhis");
$new_image = $time . "." . $extension;
$destination="./../img/treatments/".$new_image;
$action = copy($_FILES['image']['tmp_name'], $destination);

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

Также в данный момент img - это только одно поле в моей базе данных, насколько это проблема?

EDIT

Я нашел этот код, но не могу понять, как его реализовать и заставить его работать ...

После того, как мы попробовали десятки способов исправить недоработку массива $ _FILES, я не нашел ни одного, который мог бы работать с именем входа, например: userfile [christiaan] [] [] [is] [gaaf] [ ]

Итак, я придумал этот класс

<?php
/**
 * A class that takes the pain out of the $_FILES array
 * @author Christiaan Baartse <christiaan@baartse.nl>
 */
class UploadedFiles extends ArrayObject
{
    public function current() {
        return $this->_normalize(parent::current());
    }

    public function offsetGet($offset) {
        return $this->_normalize(parent::offsetGet($offset));
    }

    protected function _normalize($entry) {
        if(isset($entry['name']) && is_array($entry['name'])) {
            $files = array();
            foreach($entry['name'] as $k => $name) {
                $files[$k] = array(
                    'name' => $name,
                    'tmp_name' => $entry['tmp_name'][$k],
                    'size' => $entry['size'][$k],
                    'type' => $entry['type'][$k],
                    'error' => $entry['error'][$k]
                );
            }
            return new self($files);
        }
        return $entry;
    }
    }
    ?>

Это позволяет получить доступ к загруженному файлу, используя следующий тип ввода <input type="file" name="userfile[christiaan][][][is][gaaf][]" /> как

<?php
$files = new UploadedFiles($_FILES);
var_dump($files['userfile']['christiaan'][0][0]['is']['gaaf'][0]);
// or
foreach($files['userfile']['christiaan'][0][0]['is']['gaaf'] as $file) {
    var_dump($file);
}
?>

Ответы [ 2 ]

0 голосов
/ 12 мая 2013

Попробуйте это (ваша проблема, по-видимому, заключается в том, что на самом деле полностью отсутствует понимание того, как все это работает в php, а не какая-то конкретная проблема / ошибка /...):

whatever.php:

<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF']?>">
First file: <input type="file" name="uploads[]" /><br>
Second File: <input type="file" name="uploads[]" /><br>
Multiple files at once (firefox, chrome, ... not IE < 10): <input type="file" name="uploads_multiple[]" multiple="multiple" /><br>
<input type="submit" value="Go" />
</form>
<?php
print_r($_FILES);

Попробуйте это с разными входами (размеры файлов, отсутствующие файлы, ...), чтобы увидеть, что вы получаете от этого в php. Я думаю, что вы выиграете от этого способа больше, чем если бы выложили какой-нибудь готовый код.

Редактировать: Кроме того, не используйте копию для этого! В большинстве случаев это просто не работает, иногда это может дать неожиданные результаты, а иногда вы просто открываете банку с червями. Существует причина, по которой существует функция move_uploaded_file - ИСПОЛЬЗУЙТЕ ЭТО!

0 голосов
/ 11 ноября 2011
...