Javascript 我需要在Chrome上上传一个文件,需要**发布**一些参数

Javascript 我需要在Chrome上上传一个文件,需要**发布**一些参数,javascript,html,file-upload,Javascript,Html,File Upload,我需要上传一个文件在铬,需要张贴一些参数在同一个请求,并需要基本的身份验证。 我想使用javascript-AJAX来实现这一点。 但是chrome不支持sendAsBinary,我该怎么做呢 function sendMsg(status){ var user = localStorage.getObject(CURRENT_USER_KEY); var file = $("#imageFile")[0].files[0]; var boundary = '----

我需要上传一个文件在铬,需要张贴一些参数在同一个请求,并需要基本的身份验证。 我想使用javascript-AJAX来实现这一点。 但是chrome不支持sendAsBinary,我该怎么做呢

function sendMsg(status){

    var user = localStorage.getObject(CURRENT_USER_KEY);
    var file = $("#imageFile")[0].files[0];

    var boundary = '----multipartformboundary' + (new Date).getTime();
    var dashdash = '--';
    var crlf     = '\r\n';

    /* Build RFC2388 string. */
    var builder = '';

    builder += dashdash;
    builder += boundary;
    builder += crlf;

    var xhr = new XMLHttpRequest();
    var upload = xhr.upload;
    xhr.onreadystatechange = function(){
        if(xhr.readyState==4){
            //
        }
    };

  if(upload){
        upload.onprogress = function(ev){
            onprogress(ev);
        };
    }

    /* Generate headers. [STATUS] */            
    builder += 'Content-Disposition: form-data; name="status"';
    builder += crlf;
    builder += crlf; 

    /* Append form data. */
    builder += msg;
    builder += crlf;

    /* Write boundary. */
    builder += dashdash;
    builder += boundary;
    builder += crlf;

    /* Generate headers. [PIC] */            
    builder += 'Content-Disposition: form-data; name="pic"';
    if (file.fileName) {
      builder += '; filename="' + file.fileName + '"';
    }
    builder += crlf;

    builder += 'Content-Type: '+file.type;
    builder += crlf;
    builder += crlf; 

    /* Append binary data. */
    builder += file.getAsBinary(); //chrome do not support getAsBinary()
    builder += crlf;

    /* Write boundary. */
    builder += dashdash;
    builder += boundary;
    builder += crlf;

    /* Mark end of the request. */
    builder += dashdash;
    builder += boundary;
    builder += dashdash;
    builder += crlf;

    xhr.open("POST", apiUrl.sina.upload, true);
    xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary);
    xhr.setRequestHeader('Authorization', make_base_auth_header(user.userName, user.password));
    xhr.sendAsBinary(builder); //chrome do not support sendAsBinary()

    xhr.onload = function(event) { 
        /* If we got an error display it. */
        if (xhr.responseText) {
            console.log(xhr.responseText);
        }
    };
};

像平常一样使用表单提交文件上传请求,但是将表单的目标设置为隐藏的iframe。这不会刷新页面,但仍将上载文件。您还可以让服务器吐出一些JavaScript代码,这些代码一旦加载到隐藏的iframe中,就会在上传文件时告诉您。以下是表格:

<iframe name=UploadTarget style="visibility: hidden;"></iframe>
<form method=post target=MyHiddenIframe action="Upload.php" enctype="multipart/form-data">
  <input type=file name=File1>
  <input type=button value="Upload">
</form>

据我所知,无法在同一请求中读取表单数据和文件数据,但您可以从URL发送的信息中读取。

使用表单提交文件上传请求,就像您通常所做的那样,但将表单的目标设置为隐藏的iframe。这不会刷新页面,但仍将上载文件。您还可以让服务器吐出一些JavaScript代码,这些代码一旦加载到隐藏的iframe中,就会在上传文件时告诉您。以下是表格:

<iframe name=UploadTarget style="visibility: hidden;"></iframe>
<form method=post target=MyHiddenIframe action="Upload.php" enctype="multipart/form-data">
  <input type=file name=File1>
  <input type=button value="Upload">
</form>
据我所知,无法在同一请求中读取表单数据和文件数据,但您可以从URL发送的信息中读取。

使用xhr.sendFormData。您不需要自己构造多部分表单数据: 请看我的回答:

使用xhr.sendFormData。您不需要自己构造多部分表单数据: 请看我的回答:

builder+=file.getAsBinary; //chrome不支持getAsBinary

使用FileReader API的readAsBinaryString方法。Chrome确实支持它

xhr.sendAsBinarybuilder//铬do 不支持sendAsBinary

了解如何通过以下URL完成此操作:

builder+=file.getAsBinary; //chrome不支持getAsBinary

使用FileReader API的readAsBinaryString方法。Chrome确实支持它

xhr.sendAsBinarybuilder//铬do 不支持sendAsBinary

了解如何通过以下URL完成此操作:


但是这样我就不会设定基本的Authentication@QLeelulu-我不明白为什么不。只需像往常一样对username:password组合进行编码,并将其附加到表单的操作字符串中。用户将永远看不到发布的URL,如果这是您担心的,那么它的安全性应该不会低于其他方式。chrome中的URL不会发送基本的身份验证信息。OP将文件数据存储在内存中的javascript中,而不是表单输入中。所以这不起作用。但是这样我就不能设置基本的Authentication@QLeelulu-我不明白为什么不。只需像往常一样对username:password组合进行编码,并将其附加到表单的操作字符串中。用户将永远看不到发布的URL,如果这是您担心的,那么它的安全性应该不会低于其他方式。chrome中的URL不会发送基本的身份验证信息。OP将文件数据存储在内存中的javascript中,而不是表单输入中。所以这不起作用