提问人:D_9268 提问时间:9/14/2023 更新时间:9/14/2023 访问量:44
在 CodeIgniter 中使用 ajax 和 php 上传多个图片文件
upload multiple images files using ajax and php in CodeIgniter
问:
我在将多个图像文件上传到服务器端时遇到问题。如果有人能强调代码的问题所在,那就太好了。
最初有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>
在 javascript 定义
var selectedImages = []; //list of files in array
并在
$("#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("");
}
});
提交后在 AJAX
$('#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
...
}
});
});
});
在 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;
} ...
最后,在 uploadimg() 期间总是显示,这里的代码'undefined'
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;
}
答:
1赞
Turgay Ali
9/14/2023
#1
实际上,代码中存在多个问题。首先,您应该将语句从 for 循环中取出。您需要从列表中的每个文件创建单个文件才能上传。如果我没记错的话,Codeigniter 方法不适用于多个文件。您可以按如下方式更新uploadimg方法:$this->load->library('upload',$config)
do_upload
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;
}
PS 我明白了,您正在生成一个更易读的文件名。如果要查找具有该命名结构的文件,则应为配置数组中的encrypt_name字段设置false。
评论
0赞
D_9268
9/14/2023
感谢您指出问题。我认为这只能由真正的专家来解决,而不是那种人工智能。
评论