【问题标题】:File and Text data submission using JQuery Ajax with PHP on the server side.在服务器端使用 JQuery Ajax 和 PHP 提交文件和文本数据。
【发布时间】:2014-01-25 11:09:59
【问题描述】:

我查看了很多关于这个主题的帖子,所以请不要将其标记为重复,因为没有提供直接的答案。但是,如果您真的认为我可能遗漏了某些东西,它提供了跨浏览器支持(IE8+ 也是),请指出哪一个,然后将其标记为重复。

我想使用 JQuery AJAX 发布文件和一些文本数据,并使用 $_FILES$_POST 在服务器端的 PHP 中访问该信息。我可以在没有 AJAX 的情况下这样做。问题是当我开始使用 AJAX 时。

这是一个简单的例子:

HTML:

  <form id="upload_form" method="POST" enctype="multipart/form-data">
       <input type="text"/>
       <input type="file"/>
       <button type="submit">Submit</button>
  </form>

JAVASCRIPT:

   var ser_data = $('#upload_form').serialize();

 ...on submit... {
 ...
   upload_promise = $.ajax({
    url: 'upload1.php',  
    dataType: 'html',
    type: 'POST',
    data: ser_data,
   });
 ...
  }

好吧,我们都知道.serialize 只会序列化输入的文本字段和文件不被 JS 读取等。我不想在这里做任何花哨的事情。我只需要一种机制来访问服务器端 PHP 中的$_FILES$_POST,并在客户端输入文件名和文本数据。实际的表单有更多字段(更多文件和文本类型),但这是问题的症结所在。

【问题讨论】:

    标签: javascript php jquery html ajax


    【解决方案1】:

    要通过 ajax 发送文件和发布数据,您应该使用 FormData 对象。

    https://developer.mozilla.org/docs/XMLHttpRequest/FormData

    var fd = new FormData();
    
    var myFileInput = $(" ... "); //adapt to access your file input
    var files = myFileInput[0].files ;
    
    // The loop is there to handle file inputs with multiple files
    for(var i = 0, c = files.length ; i<c ; i++){
        var blob = new Blob(files[i]);
        var fileAccessName = "myFiles_"+i ; 
        fd.append(fileAccessName, blob, files[i].name);
    }
    
    // You can also send simple data along your files
    fd.append('otherData', $("...").val());
    
    
    $.ajax({
        url: ... , //the form's target
        data: fd,
        processData: false,
        type: 'POST',
        success: function(rep){
            // ...
        }
    }
    // since we are sending the form trough jQuery, you should also add a ev.preventDefault() to your .submit(function(ev){}) callback
    

    【讨论】:

    • 也会尝试您的解决方案。你有没有上面相对容易的cmet?我赞成你的回答。这是跨浏览器吗?
    • 从我在 jQuery 文档上看到的内容来看,.serialize 不能正确处理“文件”输入。 api.jquery.com/serialize“来自文件选择元素的数据未序列化”。我知道我的答案更复杂,但它允许您更好地控制您发送的内容(例如通过检查某些值)您可以在 MDN 上找到跨浏览器信息 - 来自 IE 10、Opera 12、Chrome 7、FF 4 的支持
    • 我正在浏览您发送的链接。我将通过它,理解它并测试它。这里有浏览器问题吗?例如 IE 8?
    • 很遗憾,旧版本的浏览器(例如 IE 8)不允许通过 JS 对其他文件进行高度控制。
    • 我接受您的回答,因为它在技术上是正确的,我没有更好的选择。我确实找到了一个 iframe 技巧,但还没有测试过。再次感谢。
    【解决方案2】:

    如果您submit(表示浏览器事件)一个表单,则您不再使用 AJAX

    • 将您的按钮更改为type="button" 而不是type="submit"
    • 将您的 Javascript 从表单元素上的 on submit ... 更改为按钮上的 on click ...
    • 为您的&lt;input&gt;s 每个人命名。
    • 添加success()failure() 回调以提醒用户它工作或失败(以及您自己的调试)。

    HTML

    <form id="uploadForm" enctype="multipart/form-data">
         <input name="theText" id="theText" type="text" />
         <input name="theFile" id="theFile" type="file" />
         <input type="button" name="send" id="send" value="Submit" />
    </form>
    

    jQuery

    ​​>
    var serData = $('#uploadForm').serialize();
    
    $('#send').on('click', function(e) {
        uploadPromise = $.ajax({
            url: 'upload1.php',  
            dataType: 'html',
            type: 'POST',
            data: serData,
            success: function() {
                alert('It worked.');
            },
            failure: function(xhr, res, err) {
                console.log(xhr);
                console.log(res);
                console.log(err);
            }
        });
    });
    

    【讨论】:

    • 这是跨浏览器?确实非常简单易懂。我现在已经投票了。在尝试并看看还会发生什么之后肯定会接受答案。奇怪的是,关于这个主题的所有其他帖子都让它看起来如此复杂。
    • 只要你使用的是低于 2.x 的 jQuery 版本,是的,跨浏览器就是游戏的名称。
    • 您很可能需要添加 contentType: '...' 以匹配您期望的文件。
    • @Samir 是的,FormData 是 XMLHTTP2 的一个不错的新增功能,我会利用它。该用户的回答很好。
    • 我会继续研究它,因为肯定有什么东西在盯着我们,我们只是不记得了。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多