第二次输入后,我无法上传任何图像。我只能上传第一个输入。当添加另一个输入值时,将动态创建输入。下面是代码:
\\ jquery //
function storeupdate(){
$.ajax({
type:"POST",
url:"<?php echo base_url(); ?>updatestore",
data:$("#mainstore").serialize(),
success: function(response){
var data = new FormData();
input = document.getElementById('file');
for(var i = 0; i < input.files.length; i++)
{
data.append('images[]', document.getElementById('file').files[i]);
}
$.ajax({
type: 'POST',
url: '<?php echo base_url(); ?>storeupload',
cache: false,
contentType: false,
processData: false,
data : data,
success: function(result){
console.log(result);
},
error: function(err){
console.log(err);
}
});
swal('Successful!', 'Data has been saved!', 'success');
//window.location.reload();
},
error: function() {
swal("Oops", "We couldn't connect to the server!", "error");
}
});
return false;
};
\\ view //
<input type="file" name="images[]" id="file" class="file" accept="image/*;capture=camera" multiple="multiple" />
<button type="button" class="btn btn-success save" id="save" name="save" onclick="storeupdate();" disabled>Save</button>
\\ controller //
public function storeupload()
{
$files= $_FILES;
$cpt = count ($_FILES['images']['name']);
for($i = 0; $i < $cpt; $i ++) {
$_FILES['images']['name'] = $files['images']['name'][$i];
$_FILES['images']['type'] = $files['images']['type'][$i];
$_FILES['images']['tmp_name'] = $files['images']['tmp_name'][$i];
$_FILES['images']['error'] = $files['images']['error'][$i];
$_FILES['images']['size'] = $files['images']['size'][$i];
$this->upload->initialize ( $this->set_upload_options1() );
$this->upload->do_upload("images");
$fileName = $_FILES['images']['name'];
$images[] = $fileName;
}
}
我制作并测试了一些代码示例,以便您可以了解问题所在。您有几处错误。我建议的第一件事实际上是使用jQuery。您的代码显然使用的是jQuery,但您可以使用各种可以简化的原始JS:
$(document).ready(function(){
$('#save').on('click', function(){
var fileInput = $('#file_input')[0];
if( fileInput.files.length > 0 ){
var formData = new FormData();
$.each(fileInput.files, function(k,file){
formData.append('images[]', file);
});
$.ajax({
method: 'post',
url:"/multi_uploader/process",
data: formData,
dataType: 'json',
contentType: false,
processData: false,
success: function(response){
console.log(response);
}
});
}else{
console.log('No Files Selected');
}
});
});
请注意,我在ajax URL中进行了硬编码。我用于测试的控制器名为Multi_uploader.php。
接下来是在控制器中循环$ _FILES时,需要将其转换为“ userfile”。如果您打算使用CodeIgniter上传类,这是非常重要的:
public function process()
{
$F = array();
$count_uploaded_files = count( $_FILES['images']['name'] );
$files = $_FILES;
for( $i = 0; $i < $count_uploaded_files; $i++ )
{
$_FILES['userfile'] = [
'name' => $files['images']['name'][$i],
'type' => $files['images']['type'][$i],
'tmp_name' => $files['images']['tmp_name'][$i],
'error' => $files['images']['error'][$i],
'size' => $files['images']['size'][$i]
];
$F[] = $_FILES['userfile'];
// Here is where you do your CodeIgniter upload ...
}
echo json_encode($F);
}
这是我用于测试的视图:
<!doctype html>
<html>
<head>
<title>Multi Uploader</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="/js/multi_uploader.js"></script>
</head>
<body>
<form>
<input type="file" name="images[]" id="file_input" multiple />
<button type="button" id="save">Upload</button>
</form>
</body>
</html>
最后,只是为了证明文件已上传到控制器,并且可以将它们与CodeIgniter一起使用,我将ajax响应作为json编码数组发送,并在控制台中显示。请参阅代码注释,您可以在其中放置CodeIgniter上传代码。
如果您要输入多个文件,那么显然会稍微改变您的HTML和JS。在这种情况下,您的HTML将具有多个输入:
<input type="file" name="images[]" class="file_input" multiple />
<input type="file" name="images[]" class="file_input" multiple />
<input type="file" name="images[]" class="file_input" multiple />
<input type="file" name="images[]" class="file_input" multiple />
而且您的javascript需要更改以遍历每个输入:
$(document).ready(function(){
$('#save').on('click', function(){
var fileInputs = $('.file_input');
var formData = new FormData();
$.each(fileInputs, function(i,fileInput){
if( fileInput.files.length > 0 ){
$.each(fileInput.files, function(k,file){
formData.append('images[]', file);
});
}
});
$.ajax({
method: 'post',
url:"/multi_uploader/process",
data: formData,
dataType: 'json',
contentType: false,
processData: false,
success: function(response){
console.log(response);
}
});
});
});
使用CodeIgniter进行上传时,会提供以下上传摘要:
$summary = $this->upload->data();
这是一个数据数组,最终看起来像这样:
$summary = array(
'file_name' => 'mypic.jpg',
'file_type' => 'image/jpeg',
'file_path' => '/path/to/your/upload/',
'full_path' => '/path/to/your/upload/jpg.jpg',
'raw_name' => 'mypic',
'orig_name' => 'mypic.jpg',
'client_name' => 'mypic.jpg',
'file_ext' => '.jpg',
'file_size' => 22.2
'is_image' => 1
'image_width' => 800
'image_height' => 600
'image_type' => 'jpeg',
'image_size_str' => 'width="800" height="200"'
);
因此,每次上传后,向数据库添加记录所需要做的就是:
$summary = $this->upload->data();
$this->db->insert('storefiles', array(
'Store_ID' => $_POST['storeid'],
'File_Name' => $summary['file_name'],
'Created' => date('Y-m-d h:i:s'),
'Modified' => date('Y-m-d h:i:s')
));
很容易看出,您可以存储的不仅仅是文件名。
我想上传多输入文件。我尝试了下面的代码,但文件没有上传,我无法获得上传目录。 HTML 控制器 我也尝试用下面的代码获取上传的数据,但为什么总是出现错误?
问题内容: 我想使用单个元素上传多个文件。所以我尝试这个例子。 使用CodeIgniter2.0上传多个文件(数组) 这是我的表格 这是我的控制器 这是我的文件上传方法 但它给每一次。有什么问题 问题答案: 我根据@Denmark 更改上传方法。
我有两个输入字段如下; 我如何上传两个文件与Foreach?我尝试了一些方法,但我无法做到这一点。 谢谢
我已经寻找和努力了三天,让这个工作,但我就是做不到。我想做的是使用多文件输入表单,然后上传它们。我不能只使用固定数量的文件上传。我在StackOverflow上尝试了许多解决方案,但我找不到一个有效的。 这是我的上传控制器 我的上传表格是这样的。 我一直有这样的错误: 您没有选择要上载的文件。 下面是示例的数组: 数组 如果我选择2个文件,我有这样的连续5次。我也使用标准的上传库。
问题内容: 我想上传多个文件,包括Word文档,PDF和图像。我需要为文件使用一个输入,因为我们不知道将上传多少文件。 我的代码是这样,但是我有问题,无法将文件发送到服务器端。 控制器代码: 视图代码的一部分: 我没有保存文件和保存对象的问题。唯一的问题:文件列表为空。 问题答案: 我要上传文件,您的表单需要包含属性。 或更好 并且我强烈建议您将模型传递给视图,并使用强类型方法为模型的属性创建ht
问题内容: 我设计了一个简单的表格,允许用户将文件上传到服务器。最初,表单包含一个“浏览”按钮。如果用户要上传多个文件,则需要单击“添加更多文件”按钮,该按钮会在表单中添加另一个“浏览”按钮。提交表单后,文件上传过程将在“ upload.php”文件中处理。对于上载多个文件,它工作得很好。现在,我需要使用jQuery的’.submit()’提交表单,并将ajax [‘.ajax()’]请求发送至’