Rumah  >  Soal Jawab  >  teks badan

Muat naik berbilang fail imej dalam CodeIgniter menggunakan Ajax dan PHP

Saya menghadapi masalah memuat naik berbilang fail imej ke bahagian pelayan. Alangkah baiknya jika seseorang boleh menyerlahkan apa yang salah dengan kod itu.

Mulanya ada kod 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>

Ditakrifkan dalam JavaScript

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

dan tangkap setiap fail yang dipilih

$("#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("");
  }
});

Gunakan AJAX selepas penyerahan

$('#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
                ...
            }
        });

     });


});

Dalam 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;
        } ...

Akhirnya sentiasa ditunjukkan semasa uploadimg() 'undefined' dan kod di sini

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粉252116587179 hari yang lalu340

membalas semua(1)saya akan balas

  • P粉268654873

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

    Sebenarnya, terdapat lebih daripada satu masalah dalam kod. Pertama sekali, anda harus menjadikan kaedah $this->load->library('upload',$config) 语句从 for 循环中取出。您需要从列表中的每个文件创建单个文件才能上传。如果我没有记错的话,Codeigniter do_upload tidak berfungsi dengan berbilang fail. Anda boleh mengemas kini kaedah uploadimg anda seperti ini:

    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 Saya nampak, anda sedang menjana nama fail yang lebih mudah dibaca. Jika anda ingin mencari fail dengan struktur penamaan ini, anda harus menetapkan medan encrypt_name dalam tatasusunan konfigurasi kepada palsu.

    balas
    0
  • Batalbalas