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

如何通过ajax发送多部分/表单数据表单内容(无jQuery)?

澹台鸿光
2023-03-14
问题内容

我试图发送某种形式而不重新加载页面,并且试图理解幕后细节,因此不使用任何JavaScript库:

var http = createRequestObject();
function createRequestObject() {
    var objAjax;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        objAjax=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        objAjax=new ActiveXObject("Microsoft.XMLHTTP");
    }
    return objAjax;
}

function display_progress() { ... }

function upload_file() {
    var request = 'UploaderServlet';
    http.open('post', request);
    http.onreadystatechange = display_progress;
    http.send(null); // HERE PROBABLY THE DATA SHOULD BE SENT
}

<form enctype="multipart/form-data" id="upload_form" name="upload_form" method="POST" action="UploaderServlet" onsubmit="upload_file(); return false;" target="upload_target">
Choose a file <br />  
<input name="file" size="27" type="file" id="file" /> <br/> 
<input type="submit" name="uploadSubmitButton" value="Upload" /><br /> 
<br />  
</form>

<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

调用了upload_file(),但如果我做对了,则不会发送数据。请提供有关发送数据的正确方式的建议。


问题答案:

通过表单传递属性 {url:"",method:"",data:{...},callback:function(){}}

var ajax=function(){
  try{
    var xml       =new XMLHttpRequest();
    var args      =arguments;
    var context   =this;
    var multipart ="";

    xml.open(args[0].method,args[0].url,true);

    if(args[0].method.search(/post/i)!=-1){
      var boundary=Math.random().toString().substr(2);
      xml.setRequestHeader("content-type",
                  "multipart/form-data; charset=utf-8; boundary=" + boundary);
      for(var key in args[0].data){
        multipart += "--" + boundary
                   + "\r\nContent-Disposition: form-data; name=" + key
                   + "\r\nContent-type: application/octet-stream"
                   + "\r\n\r\n" + args[0].data[key] + "\r\n";
      }
      multipart += "--"+boundary+"--\r\n";
    }

    xml.onreadystatechange=function(){
      try{
        if(xml.readyState==4){
          context.txt=xml.responseText;
          context.xml=xml.responseXML;
          args[0].callback();
        }
      }
      catch(e){}
    }

    xml.send(multipart);
  }
  catch(e){}
}

如果您想获得回覆,可以使用这个

var response={};
ajax.call(response,{...args...})

您可以通过response.txt或检索所有数据response.xml

更新有点晚

至于有关<input type='file'>上传的@Varun问题,此代码无法直接处理文件上传,要使用此代码发送文件,您需要使用File
API
对原始文件数据进行预处理,以获取非二进制流(例如base64或任何其他类似于bin2hex的形式)。

但是,由于这是2015年,我可以建议从多部分流的构造过渡到更强大的构造,例如FormData
API



 类似资料:
  • 这是在服务器端作为接收的内容: 如何转换multipart Confont数据类型中的文章对象?我读到改造可能允许使用转换器为这个。就我对文档的理解而言,它应该是实现的东西。 多部分部件使用的转换器,或者它们可以实现来处理自己的序列化。 null

  • 我正在尝试用RestTemplate上传一个文件到带有Jetty的Raspberry Pi。在Pi上有一个运行的servlet: 这是我得到的输出: UI-elements.html已上传! org.springframework.web.multipart.support.StandardMultipartTtpServletRequest$StandardMultipartFile@47e76

  • 既然约翰·康德(John Conde)提出了这个建议,我将尝试更准确地描述我的问题。 大体上。js我正试图将我的表单对象发送到提交时。我如何做到这一点是通过选择表单对象并创建对象并将其发送到使用AJAX: 很明显,由于某种原因,我的对象没有被发送到我的。我认为它的b/c的。我这样做的原因是b/c我试图在我的中上传一个文件,这篇文章说在我的AJAX调用中做。 如果你知道我做错了什么,请告诉我,谢谢!

  • 问题内容: 我的页面上有多种形式。当我单击表单提交按钮时,我想通过ajax仅发送该表单的表单值。这就是我所拥有的。第一种形式按预期工作,第二种形式实际提交表单。如何分别定位每个表单。我觉得我应该在某个地方使用.find()。 问题答案: 请勿对多个元素使用相同的ID。使用类代替。 将代码更改为此:

  • 问题内容: 我一直在使用与杰克逊结合使用Apache CXF来消费和产生JSON文件的Web服务。 但是,服务的一种方法应该能够保存从移动应用程序上传的图像,该图像向我的Web服务发出多部分/表单数据POST请求,而且我不知道如何在我的内部处理这种内容类型上下文。我们通常创建“ Request”和“ Response”对象来使用和产生JSON,但是,在这种情况下,这恐怕不起作用。 这是请求格式:

  • 问题内容: 我想以ajax的形式发送所有输入。我有这样的形式。 在.js文件中,我们有以下代码: 但这不起作用。我不想使用Form数据。 问题答案: 只要我们要发送具有名称属性的所有表单输入字段,就可以对所有表单执行此操作,而与字段名称无关: 第一个解决方案 第二个解决方案 :在此解决方案中,您可以创建一个输入值数组: