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

Ajax上传无法正常工作

李烨烁
2023-03-14
问题内容

我正在使用codeigniter 3.1。我想使用ajax发布上传数据。

Ajax上传文件不起作用。但是,当我发布不带ajax的简单表单时,它工作正常。

我不知道为什么,但控制台没有错误。

的HTML

  <?php echo form_open_multipart(site_url("upload/post"), ['id' => 'uploader']) ?>
    <input type="file" name="userfile" value="">
    <input type="submit" value="Submit" />
  <?php echo form_close() ?>

JAVASCRIPT

   $('#uploader').submit(function (event) {
            event.preventDefault();
            $.ajax({
                url: window.location.href + '/post',
                type: "POST",
                dataType: 'json',
                data: new FormData(this)
               });
      });

控制器

 public function post() 
    {
        $this->load->helper('url');
        $this->load->helper('form');
        $this->load->library("upload");
        $file = $this->common->nohtml($this->input->post("userfile"));

        $this->upload->initialize(array( 
               "upload_path" => 'upload',
               "overwrite" => FALSE,
               "max_filename" => 300,
               "encrypt_name" => TRUE
            ));

        $this->upload->do_upload('userfile');

        $data = $this->upload->data();

        $image_file = $data['file_name'];

  }

问题答案:

问题之一是文件上传使用的机制与其他表单<input>类型不同。这就是为什么$this->input->post("userfile")没有为您完成工作的原因。其他答案建议使用javascript,FormData而这个答案也可以。

的HTML

一个非常简单的表单,用于选择文件并提交。请注意从简单按钮更改为<input type="submit"...。这样做使javascript使用该FormData对象变得容易得多。

FormData文档

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script src="https://code.jquery.com/jquery-2.2.2.js"></script>
        <title>Upload Test</title>
    </head>
    <body>

        <?= form_open_multipart("upload/post", ['id' => 'uploader']); ?>
        <input type="file" name="userfile">
        <p>
            <input type="submit" value="Upload">
        </p>
        <?php echo form_close() ?>

        <div id="message"></div>

        <script>
            $('#uploader').submit(function (event) {
                event.preventDefault();
                $.ajax({
                    url: window.location.href + '/post',
                    type: "POST",
                    dataType: 'json',
                    data: new FormData(this),
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        console.log(data);
                        if (data.result === true) {
                            $("#message").html("<p>File Upload Succeeded</p>");
                        } else {
                            $("#message").html("<p>File Upload Failed!</p>");
                        }
                        $("#message").append(data.message);
                    }
                });
            });
        </script>
    </body>
</html>

JAVASCRIPT

使用FormData捕捉到的领域。请注意,我们处理提交事件而不是处理按钮单击。

$('#uploader').submit(function (event) {
    event.preventDefault();
    $.ajax({
        url: window.location.href + '/post',
        type: "POST",
        dataType: 'json',
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data) {
            //uncomment the next line to log the returned data in the javascript console
            // console.log(data);
            if (data.result === true) {
                $("#message").html("<p>File Upload Succeeded</p>");
            } else {
                $("#message").html("<p>File Upload Failed!</p>");
            }
            $("#message").append(data.message);
        }
    });
});

控制器

我添加了一些将结果“报告”到ajax的代码,并将其显示在上传页面上。

class Upload extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->helper(['form', 'url']);
    }

    public function index()
    {
        $this->load->view('upload_v');
    }

    public function post()
    {
        $this->load->library("upload");
        $this->upload->initialize(array(
                "upload_path" => './uploads/',
                'allowed_types' => 'gif|jpg|png|doc|txt',
                "overwrite" => FALSE,
                "max_filename" => 300,
                "encrypt_name" => TRUE,
        ));

        $successful = $this->upload->do_upload('userfile');

        if($successful)
        {
            $data = $this->upload->data();
            $image_file = $data['file_name'];
            $msg = "<p>File: {$image_file}</p>";
            $this->data_models->update($this->data->INFO, array("image" => $image_file));
        } else {
            $msg = $this->upload->display_errors();
        }

        echo json_encode(['result' => $successful, 'message' => $msg]);
    }

}

这将上传您的文件。您的工作可能没有完成,因为我怀疑您没有将所需的所有文件信息保存到数据库中。那,我怀疑您会对上载文件的名称感到惊讶。

我建议您研究一下PHP如何处理文件上传,并在SO
上检查有关文件上传的一些类似codeigniter相关问题。



 类似资料:
  • 问题内容: 我已经尝试解决这一问题了一段时间,但是我无法使其正常工作。当用户单击链接时,系统会要求他确认他要执行此操作。然后进行ajax调用。调用的脚本可以正常工作,并返回重定向到的字符串。 我在这里看到了几个关于window.location问题的帖子,但是它们都无法解决我的问题。 我的代码: 如果不这样做,我可以看到传递了正确的数据。例如/ user / homepage。但是,重定向尚未发生

  • 问题内容: 我想在“ div”中显示txt文件的内容,所以我用按钮调用函数,但是即使我不按按钮,函数也会触发,这是我的HTML代码: 和我的js代码: 问题答案: 的第二个参数应该是一个函数。您没有传递函数,而是立即调用该函数并传递结果。改成:

  • 问题内容: 在ajax中使用base_url()从codeigniter项目中获取数据库。给定的base_url就像http://domainname.com。很好 如果我可以在地址栏中输入http://www.domainname.com之类的网址,则无法正常工作。该代码是 请帮助解决此问题。谢谢 问题答案: 我认为最好的解决方案是: 只需在HTML的标头部分中添加以下脚本即可。 然后在您的Aj

  • 问题内容: 我将拔出所有剩余的头发,因此,如果您知道可能是什么问题,请帮助我。谢谢。我所有的谷歌搜索和搜索都没有得到回报。 首先,我正在使用jquery-1.7.2.min.js和ASP.net 2.0 Web表单。 我正在尝试使用jquery进行ajax调用,但始终收到语法错误/解析错误消息。我尝试了许多不同的方法,但是当我将dataType设置为json时,它们都会导致错误。 这是我所拥有的:

  • 问题内容: 我正在尝试使用以下代码: 我需要检查是否返回false,但是当删除时,它不再起作用。为什么会这样,我如何使它起作用? 问题答案: 当您引入警报时它起作用的原因是,它停止了执行并为异步调用提供了足够的时间来完成。 您没有获得正确的值,因为在发布请求完成且回调已执行时,您的JavaScript已经完成执行。 您在这里有一些选择: 声明全局变量并执行同步调用,您可以使用发布的代码ABC进行此

  • 在windows上使用netbeans已经很久了,没有问题。在Debian上安装了它,它启动了,但大多数按钮没有响应(新项目/新文件...)。 这是使用终端发射时的结果。 Netbeans版本:8.2 OS:Parrot(debian OS的发行版)JDK版本:9.0.1 提前道谢。