当前位置: 首页 > 面试题库 >

使用CodeIgniter和Ajax在每个输入中上传多个文件

史景铄
2023-03-14
问题内容

第二次输入后,我无法上传任何图像。我只能上传第一个输入。当添加另一个输入值时,将动态创建输入。下面是代码:

\\ 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()’]请求发送至’