Maison > Questions et réponses > le corps du texte
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粉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.