web-dev-qa-db-fra.com

Télécharger plusieurs fichiers dans CodeIgniter

Dans mon projet CodeIgniter, je télécharge des fichiers lors de la création du projet. Voici la fonction de téléchargement:

function uploadFiles(){

     $this->load->library('upload');  
     $error = 0;    
     $projectName = $_POST['projectname'];
     mkdir('./uploads/'.$projectName);

     for($i=0; $i<count($_FILES); $i++)
     {

       $_FILES['userfile']['name']    = $_FILES['files']['name'][$i];
       $_FILES['userfile']['type']    = $_FILES['files']['type'][$i];
       $_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
       $_FILES['userfile']['error']       = $_FILES['files']['error'][$i];
       $_FILES['userfile']['size']    = $_FILES['files']['size'][$i];

       $config['upload_path']   = './uploads/'.$projectName;
       $config['allowed_types'] = 'xml|etl';
       $config['max_size']      = '0';
       $config['overwrite']     = TRUE;

      $this->upload->initialize($config);

      if($this->upload->do_upload())
      {
        $error += 0;
      }else{
        $error += 1;
      }
     }

     if($error > 0){ return FALSE; }else{ return TRUE; }

}

Et j'appelle cette fonction dans la fonction create_project comme ceci:

public function create_project() {
    $this->load->library('form_validation');

    $this->form_validation->set_rules('projectname', 'Project name', 'required');

    $this->form_validation->set_message('required', 'This is an obligatory field');

    if($this->form_validation->run() == FALSE) {
        $this->load->view('project_creation_view');
    } else {
        $this->load->model('Project_management_model');
        $this->Project_management_model->create_project();
        $this->uploadFiles();
    }
}

Cependant cela ne fait rien. Les fichiers ne sont pas téléchargés. Même un répertoire vide n'est pas créé. Quelqu'un pourrait-il m'aider à trouver l'erreur?

Merci.

15
cycero

Vous pouvez télécharger n'importe quel nombre de fichiers.

$config['upload_path'] = 'upload/Main_category_product/';
$path=$config['upload_path'];
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1024';
$config['max_width'] = '1920';
$config['max_height'] = '1280';
$this->load->library('upload', $config);

foreach ($_FILES as $fieldname => $fileObject)  //fieldname is the form field name
{
    if (!empty($fileObject['name']))
    {
        $this->upload->initialize($config);
        if (!$this->upload->do_upload($fieldname))
        {
            $errors = $this->upload->display_errors();
            flashMsg($errors);
        }
        else
        {
             // Code After Files Upload Success GOES HERE
        }
    }
}
22
srbhbarot

Il s’agit d’une extension de la classe CI_Upload que j’ai modifiée pour télécharger plusieurs fichiers. Il suffit de la copier dans le fichier MY_Upload.php. Cela fait aussi le répertoire.

http://Pastebin.com/g9J6RxW1

Ensuite, tout ce que vous devez faire dans la fonction de contrôleur est d'organiser vos fichiers dans un tableau, où le nom du champ et la clé sont les clés du tableau et la configuration est les données. Dans votre cas, quelque chose comme ceci:

$project_files['files'][0] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );
$project_files['files'][1] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );

SI toutes les configurations de fichiers sont identiques, il suffit de créer une boucle for pour le configurer. Il faudra également utiliser les "clés nommées", c'est-à-dire. $project_files['files']['file_key'].

alors appelez simplement:

 if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/}
2
Cubed Eye

Je ne peux pas encore commenter à cause de mon niveau de réputation, mais Zoom a commenté sous la réponse acceptée que la variable $ fieldname était un tableau ayant provoqué une erreur. J'ai eu le même problème avec cette réponse et j'ai découvert que c'était parce que j'avais ajouté tous les noms d'entrée de mon fichier sur le formulaire avec [], ce qui permettait à php de prendre ces entrées sous forme de variable tableau. Pour résoudre ce problème, attribuez un nom unique à chaque entrée de fichier au lieu d'en faire un tableau PHP. Après que j'ai fait cela, le problème est parti pour moi et la réponse acceptée a fonctionné comme un charme. Je pensais que je transmettrais les informations à quiconque tomberait sur cette question.

1
Reasoned

Je pensais avoir vu la même question ici avant;)

Essayez de sortir $ this-> upload-> display_errors () où vous incrémentez la variable $ error. Cela vous dira exactement ce qui ne va pas. Mon argent est sur les autorisations ...

0
landons

J'ai modifié MY_upload de Cubed Eye pour renvoyer les informations de fichier de tous les fichiers téléchargés. En l'état, seules les informations du dernier fichier étaient accessibles lors de l'appel de la méthode de données. J'ai également ajouté l'adresse IP de l'uploader à cette liste.

http://Pastebin.com/tG8A85gY

Il peut être utilisé par:

$upload_files = $this->upload->upload_files($project_files);
if ($upload_files->status == true)
{
$fileInfo = $uploaded_files->file_info;
}

Je me rends compte que ce serait mieux comme montage chez Cubed Eye mais ceci est mon premier post, je n’ai aucune réputation.

0
coderp

Je pense que vous avez manqué ceci:

 $ config ['nom_fichier'] = 'un nom _'. $ i; 
 $ config ['upload_path'] = './uploads/'.$projectName;
 .. . 
0
Sudhir Bastakoti

Pour la simplicité, j'ai créé ce fichier d'assistance CI. Vous pouvez le charger depuis un fichier de configuration et l'utiliser n'importe où dans votre projet.

@fileobject = nom de l'objet de fichier HTML

@fileopath = chemin du fichier que vous souhaitez télécharger

@filetypes = default *, ex- 'jpg | png | mp4 | pdf'

function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*"){
// retrieve the number of images uploaded;
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']);

// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE.
$files = $_FILES[$fileobject];

$errors = array();
$file_arr = array();
$result = array();

// first make sure that there is no error in uploading the files
for ($k = 0; $k < $number_of_files; $k++) {
    if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k];
}
if (sizeof($errors) == 0) {
    // now, taking into account that there can be more than one file, for each file we will have to do the upload
    // we first load the upload library
    $CI =& get_instance();

    $CI->load->library('upload'); // load library

    // next we pass the upload path for the images
    $config['upload_path'] = FCPATH . $filepath;
    // also, we make sure we allow only certain type of images
    $config['allowed_types'] = $filetypes;
    //$config['max_size'] = (int)(ini_get('upload_max_filesize'));
    $config['max_size'] = '10000';
    $config['overwrite'] = FALSE;

    for ($i = 0; $i < $number_of_files; $i++) {
        $_FILES['uploadedimage']['name'] = $files['name'][$i];
        $_FILES['uploadedimage']['type'] = $files['type'][$i];
        $_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i];
        $_FILES['uploadedimage']['error'] = $files['error'][$i];
        $_FILES['uploadedimage']['size'] = $files['size'][$i];
        //now we initialize the upload library
        $CI->upload->initialize($config);
        // we retrieve the number of files that were uploaded
        if ($CI->upload->do_upload('uploadedimage')) {
            $imageup = $CI->upload->data();
           // print_r($imageup["orig_name"]);die;
            array_Push($file_arr, $imageup["orig_name"]);
            $result["response"] = "true";
            $result["message"] = "Files uploaded successfully.";
            $result["files"] = $file_arr;

        } else {
            $result["response"] = "false";
            $result["message"][$i] = $CI->upload->display_errors();
        }
    }

} else {
    $result["response"] = "false";
    $result["message"] = $errors;

}
return $result;}

Testé et prouvé.

0
Tharanga