recherche

Maison  >  Questions et réponses  >  le corps du texte

Téléchargez plusieurs fichiers image dans CodeIgniter en utilisant Ajax et PHP

J'ai du mal à télécharger plusieurs fichiers image côté serveur. Ce serait formidable si quelqu'un pouvait souligner ce qui ne va pas avec le code.

Au départ, il y a du code HTML :

<label class="col-form-label"><h4>Upload Images</h4></label>
              <div id="image-preview-container">
                <!-- Preview images will be displayed here -->
              </div>
              <form id="uploadCert" enctype="multipart/form-data">
                <input type="file" id="images" name="images" multiple="multiple" accept="image/*" style="display: none;">
                <label for="images" class="btn btn-primary"> Add Image </label>
              </form>
            </div>

Défini en JavaScript

var selectedImages = []; //list of files in array

et capturez chaque fichier sélectionné

$("#images").change(function () {
  var file = this.files[0];

  if (file) {
    ...

    // Append the container to the image preview container
    $("#image-preview-container").append(imageContainer);

    ..

    // Add the selected image file to the postData.images array
    selectedImages.push(file);
    
    $(this).val("");
  }
});

Utilisez AJAX après la soumission

$('#addcart').click(function () {

        // Add other form fields to formData
        var formData = new FormData();
        ...
        formData.append("issuesBody", $("#fbody_").val());
        ...
        
        if (selectedImages.length > 0) {
            // Append each selected image to formData
            for (var i = 0; i < selectedImages.length; i++) {
                var image = selectedImages[i];
                if (image instanceof File) {
                  // If it's a File object, append it to formData
                  formData.append("images[]", image);

                }
            }
        } else {
            // If no selected images, set images[] to an empty array
            formData.append("images[]", []);
        }

        // Make the AJAX request
        event.preventDefault();
        $.ajax({
            url: "addcert",
            type: "POST",
            data: formData,
            dataType:"json",
            contentType:false,
            cache:false,
            processData: false,
            success: function(data){
                // Handle a successful response
                ...
            },
            error: function (xhr, status, error) {
                // Handle an error response
                ...
            }
        });

     });


});

En PHP

private function addNewCert(){
        // Capture POST data
        $issuesBody = $this->input->post('issuesBody'); 
        // Not sure if this is the way to capture the posted file data
        $images = $_FILES['images']; 

        // Upload images to the server
        $uploadedFiles = $this->uploadimg($images);

        //Check if image uploads were successful
        if ($uploadedFiles === false) {
            // Handle the case where image uploads failed
            ...
            echo json_encode($output);
            return;
        } ...

Enfin toujours affiché lors de uploadimg() 'undefined' et le code ici

private function uploadimg($images) {
        $uploadedFiles = array(); // captured uploaded file name

        // Loop through each uploaded file
        for ($i = 0; $i < count($images['name']); $i++) {
            // Generate a unique file name or use the original name
            $originalFileName = $images['name'][$i];
            $fileExtension = pathinfo($originalFileName, PATHINFO_EXTENSION);
            $file_name = uniqid() . '_' . $originalFileName;

            $config['upload_path'] = $this->uploadPath;
            $config['file_name'] = $file_name;
            $config['allowed_types'] = 'jpg|jpeg|png|gif'; 
            $config['max_size'] = 2048; 
            $config['encrypt_name'] = TRUE; 

            $this->load->library('upload', $config);

            // Perform the upload
            if ($this->upload->do_upload('images')) {
                $uploadedFiles[] = $file_name;
            } else {
                // Handle the case where an upload failed
                return false;
            }
        }

        return $uploadedFiles;
    }

P粉252116587P粉252116587266 Il y a quelques jours568

répondre à tous(1)je répondrai

  • P粉268654873

    P粉2686548732024-04-04 13:26:22

    En fait, il y a plus d'un problème dans le code. Tout d’abord, vous devez faire en sorte que la méthode $this->load->library('upload',$config) 语句从 for 循环中取出。您需要从列表中的每个文件创建单个文件才能上传。如果我没有记错的话,Codeigniter do_upload ne fonctionne pas avec plusieurs fichiers. Vous pouvez mettre à jour votre méthode de téléchargement comme ceci :

    private function uploadimg($images) {
        $uploadedFiles = array(); // captured uploaded file name
    
        $config = [
            'upload_path' => './testUploads/',
            'allowed_types' => 'jpg|jpeg|png|gif',
            'max_size' => 2048,
            'encrypt_name' => TRUE,
        ];
        $this->load->library('upload', $config);
    
        // Loop through each uploaded file
        for ($i = 0; $i < count($images['name']); $i++) {
            // Generate a unique file name or use the original name
            $originalFileName = $images['name'][$i];
            $fileExtension = pathinfo($originalFileName, PATHINFO_EXTENSION);
            $file_name = uniqid() . '_' . $originalFileName;
    
            $config['file_name'] = $file_name;
            $this->upload->initialize($config);
    
            $_FILES['singleImage']['name']     = $file_name;
            $_FILES['singleImage']['type']     = $images['type'][$i];
            $_FILES['singleImage']['tmp_name'] = $images['tmp_name'][$i];
            $_FILES['singleImage']['error']    = $images['error'][$i];
            $_FILES['singleImage']['size']     = $images['size'][$i];
            
    
            // Perform the upload
            if ($this->upload->do_upload('singleImage')) {
                $uploadedFiles[] = $file_name;
            } else {
                // Handle the case where an upload failed
                return false;
            }
        }
    
        return $uploadedFiles;
    }

    P.S Je vois, vous générez un nom de fichier plus lisible. Si vous souhaitez rechercher des fichiers avec cette structure de dénomination, vous devez définir le champ encrypt_name dans le tableau de configuration sur false.

    répondre
    0
  • Annulerrépondre