【问题标题】:Not able to upload a file using ajax无法使用ajax上传文件
【发布时间】:2018-07-27 02:34:37
【问题描述】:

我正在尝试使用 ajax 上传表单数据,但问题是我无法上传图像/文件。

表格代码

<form class="form-inline" id="form_add"  enctype="multipart/form-data"> 
  <input type="file" id="file-input" name="file-input"  accept="image/*" >

  <input type="text" class="form-control name" id="fname" placeholder="First Name" >                            
  <select class="location" id="location" >
    <option value="">Location</option>
    <?php foreach($location as $loc): ?>
      <option value="<?php echo $loc->city.', '.$loc->state;?>" ><?php echo $loc->city.', '.$loc->state;?></option>
    <?php endforeach; ?>
  </select>
  <button type="submit" class="save_btn"  id="submit" > <img src="save.png" class="Save">   </button>
</form>

脚本代码

<script>
  $("#submit").click(function()
    {
      event.preventDefault();
      var filename = $('input[type=file]').val();
      var fname = $("#fname").val();
      var location = $("#location").val();
      if(filename != "" || fname != "" || location != "")
            {
              $.ajax({
                type: "POST",
                url: "Data/add_data",
                data: {
                        filename : filename,
                        fname:fname,
                        location:location
                      },
                cache: false,
                success: function(result){
                  console.log(result);
                }});
            }
    });
</script>

后端代码

$ImageFile = $this->input->post('filename');
$config['upload_path'] = './assets/client_img/.';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = 1024 * 8;
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);

if (!$this->upload->do_upload('ImageFile')) 
    {
     $error1 = array('error' => $this->upload->display_errors());
     print_r($error1);
    }
else
    {
      $data1 = $this->upload->data();
      echo $data1['file_name'];
    }

在后端代码中,我将 $ImageFile 的值设为 C:\fakepath\pic.jpg 但文件未上传,错误提示

您没有选择要上传的文件

谁能告诉我如何上传文件

【问题讨论】:

  • 需要使用FormData并设置processData: false, stackoverflow.com/questions/6974684/…
  • @angel.bonev 使用建议链接中告诉的方法将不得不让我更改我的整个代码,是否有任何替代方法
  • 为什么你需要改变整个代码只是将 ajax 中的数据更改为数据:FormData 并创建 FormData 类似的东西 var formData = new FormData(); formData.append('filename', $('input[type=file]')[0].files[0]); formData.append('fname', $('#fname')[0].val()); formData.append('location', $('#location')[0].val());

标签: javascript php jquery ajax file-upload


【解决方案1】:

我注意到的几件事

var filename = $('input[type=file]').val() 

没有;

您可以尝试添加以下字段吗:

 $.ajax({
            type: "POST",
            url: "Data/add_data",
            data: {
                    filename : filename,
                    fname:fname,
                    location:location
                  },

            contentType: false,
            processData: false,
            cache: false,
            success: function(result){
              console.log(result);
            }});
        }

因为它可能与 contentType 有关。也可能是$this-&gt;upload-&gt;do_upload 函数,可能是您没有正确保存文件。但是您没有为此提供代码。

【讨论】:

  • 第一个问题是我在发布问题时犯的错误,我已经更正了,您给出的第二个解决方案,我尝试过,但仍然得到相同的结果
【解决方案2】:

尝试下面的代码并在 ajax 代码中做一些更改。在代码中添加以下参数。

processData: false, contentType: false,

并在 ajax 开始之前添加 var formData = new FormData($("#form_add")[0]); 行。

或检查下面的代码并根据您的代码进行更改。

$("#submit").click(function(){
    event.preventDefault();
    var filename = $('input[type=file]').val();
    var fname = $("#fname").val();
    var location = $("#location").val();
    var formData = new FormData($("#addad")[0]);
    if(filename != "" || fname != "" || location != ""){
        $.ajax({
            type: "POST",
            url: "Data/add_data",
            data:formData,
            cache: false,
            processData: false,
            contentType: false,
            success: function(result){
                  console.log(result);
            }
        });
    }
});

【讨论】:

  • 我在后端得到空白结果
  • 你在打印什么?
【解决方案3】:
$("#submit").click(function ()
{
    event.preventDefault();
    var filename = $('input[type=file]').val();
    var fname = $("#fname").val();
    var location = $("#location").val();


    if (filename != "" || fname != "" || location != "")
    {
        var formData = new FormData();
        formData.append('filename', $('input[type=file]')[0].files[0]);
        formData.append('fname', fname);
        formData.append('location', location);
        $.ajax({
            type: "POST",
            url: "Data/add_data",
            data: formData,
            contentType: false,
            processData: false,
            cache: false,
            success: function (result) {
                console.log(result);
            }});
    }
});

【讨论】:

  • 我仍然收到同样的信息
  • 转储 $_FILES AND $_POST 文件必须在 $_FILES["filename"] 中,所有其他数据必须在 $_POST 中
  • 尝试将“if (!$this->upload->do_upload('ImageFile'))”更改为“if (!$this->upload->do_upload('filename'))”
【解决方案4】:

您好,您需要序列化表单

<script>
  $("#submit").click(function()
    {
      event.preventDefault();

              $.ajax({
                type: "POST",
                url: "Data/add_data",
                data: $('#form_add').serialize(),
                cache: false,
                success: function(result){
                  console.log(result);
                }});
            }
    });
</script>

& 在 php 中检查类似

$ImageFile = $this->input->post('filename');
$config['upload_path'] = './assets/client_img/.';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = 1024 * 8;
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);

if (!$this->upload->do_upload('ImageFile')) 
    {
     $error1 = array('error' => $this->upload->display_errors());
     print_r($error1);
    }
else
    {
      $data1 = $this->upload->data();
      echo $data1['file_name'];
    }

【讨论】:

  • 在后端,文件名将从哪里被挑选?
  • 请在序列化所有数据发送特定操作时使用相同的登录名进行检查
猜你喜欢
  • 2016-07-16
  • 2011-11-22
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2020-10-06
  • 2018-11-20
  • 2018-12-23
相关资源
最近更新 更多