【问题标题】:getting error while uploading image via Ajax通过 Ajax 上传图片时出错
【发布时间】:2017-03-27 17:13:00
【问题描述】:

我无法通过 ajax 上传多个文件。这是我的代码。

HTML 代码:-

   <input type="file" id="txtBusinessImage" class="form-control" name="txtBusinessImageName[]" multiple >

    <input type="hidden" id="selectBusinessHiddenID" name="selectBusinessHiddenID" value="<?php echo $viewCompanyResult->company_id; ?>">

    <input type="button" id="uploadBusinessImg" value="Upload" >

Ajax 代码:-

$("#uploadBusinessImg").on("click",function(e)
{
                var fd = new FormData();
                var file_data = $("#txtBusinessImage")[0].files; // for multiple files
                for(var i = 0;i<file_data.length;i++){
                    fd.append("file"+[i], file_data[i]);
                }
                var other_data = $("#selectBusinessHiddenID").serializeArray();
                $.each(other_data,function(key,input){
                    fd.append(input.name,input.value);
                });

                $.ajax({
                    url: '<?php echo site_url('Main_ctrl/upload_business_photo_do'); ?>',
                    data: fd,
                    enctype: 'multipart/form-data',
                    contentType: false,
                    processData: false,
                    type: 'POST', async : true,
                    success: function(data){
                        alert(data);
                    }
                });
});

当我通过 Ajax 调用 upload_business_photo_do() 函数时,它无法接收图像的名称 $_FILES['file']['name']

upload_business_photo_do()
{
     $business_hidden_id=$this->input->post('selectBusinessHiddenID');

        /*code for image*/
        $config['upload_path']='./upload_101/';
        $config['allowed_types']= 'jpg|png|jpeg';
        $config['max_width'] = '6000';
        $config['max_height'] = '4500';

        $this->load->library('upload',$config);
        for($i=0; $i<count($_FILES['file']['name']); $i++)
        {
            $_FILES['userfile']['name']= $_FILES['file']['name'][$i];
            $_FILES['userfile']['type']= $_FILES['file']['type'][$i];
            $_FILES['userfile']['tmp_name']= $_FILES['file']['tmp_name'][$i];
            $_FILES['userfile']['error']= $_FILES['file']['error'][$i];
            $_FILES['userfile']['size']= $_FILES['file']['size'][$i];

            if(! $this->upload->do_upload())
            {
                /*----set flash message*/
                echo "error";

            }
            else
            {
                echo "done";

            }

        }
}

【问题讨论】:

  • 您可以在网络选项卡下的 chrome 开发人员控制台中检查您发送请求的格式。这样您就可以知道您的请求是如何发送的。
  • yaa 我已经在我的代码中检查过 fd.append("file"+[i], file_data[i]);在这一行中,我发送 name="file" 但我无法在函数 upload_business_photo_do() 中接收文件名
  • 你有没有在表单标签中提到 enctype="multipart/form-data"
  • 再次遇到同样的错误......添加 enctype="multipart/form-data"
  • 在您的 upload_business_photo_do() 方法中添加 txtBusinessImageName 而不是文件 $_FILES['txtBusinessImageName ']['name'] 用 txtBusinessImageName 替换所有文件

标签: php jquery ajax codeigniter


【解决方案1】:

试试这样用,简单好用

    $("#uploadBusinessImg").on("click",function(e)
    {

               var formData = new FormData($("#form_name")[0]);
                $.ajax({
                    url: '<?php echo site_url('Main_ctrl/upload_business_photo_do'); ?>',
                    processData: false,
                    contentType: false,
                    data: formData,
                    type: 'POST', async : true,
                    success: function(data){
                        alert(data);
                    }
                });
      });

在控制器中像这样使用

if($_FILES['txtBusinessImageName']) 
    {
        $file_ary =  $this->reArrayFiles($_FILES['txtBusinessImageName']);

        foreach ($file_ary as $file) 
        {
            print 'File Name: ' . $file['name'];
            print 'File Type: ' . $file['type'];
            print 'File Size: ' . $file['size'];
        }
     }

还可以使用此函数将文件数据转换为多个图像数据的数组

function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}

它的工作完美,只是尝试使用它。您不需要使用 ajax 添加额外的文件代码。

【讨论】:

  • 随时,伙计@SupportTechcherry
【解决方案2】:

使用表单标签和提交按钮进行文件上传。

<form method="post" enctype="multipart/form-data">
<input type="file" id="txtBusinessImage" class="form-control" name="txtBusinessImageName[]" multiple >
<input type="hidden" id="selectBusinessHiddenID" name="selectBusinessHiddenID" value="<?php echo $viewCompanyResult->company_id; ?>">
<input type="submit" id="uploadBusinessImg" value="Upload">
</form>

并从 ajax 调用中删除 enctype: 'multipart/form-data' 并尝试。

更改以下内容以获取文件:

var file_data = $('#txtBusinessImage').prop('files')[0];   
var fd = new FormData();                  
fd.append('file', file_data);

【讨论】:

  • 你确定,你在 file_data 中上传文件吗?
  • 是的,我确定。我已经在网络选项卡下的 chrome 开发者控制台中检查了 name="file"。
  • 添加代码后它没有发送名称属性
  • 由于您发送文件详细信息“file”+[i]”,因此您需要在 php 中以相同的方式访问,我觉得简单的“file”行不通。$_FILES['file'] 是否提供任何值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多