Javascript在xhttp POST请求中使用zip文件发送元数据

Javascript在xhttp POST请求中使用zip文件发送元数据,javascript,arrays,Javascript,Arrays,我需要上传带有元数据的zip文件,如标题和特定数字 或者我直接用以下方式发送zip文件: function generalPostRequest(content, url, cb) { var xhttp = new XMLHttpRequest(); xhttp.open("POST", url, true); xhttp.withCredentials = true; xhttp.setRequestHeader("Authorization", "B

我需要上传带有元数据的zip文件,如标题和特定数字

或者我直接用以下方式发送zip文件:

function generalPostRequest(content, url, cb) {    
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", url, true);
    xhttp.withCredentials = true;
    xhttp.setRequestHeader("Authorization", "Basic " + btoa("NAME:PASS"));

    //DIFF
    xhttp.setRequestHeader("Content-Type", "application/zip");
    //DIFF

    xhttp.onreadystatechange = function () {
        if (xhttp.readyState === 4 && xhttp.status === 200) {
            if (cb) {
                cb(JSON.parse(xhttp.response));
            }
        }
    };
    xhttp.send(content);//DIFF
}
但是我不知道如何添加元数据。 另一种方式是:

function generalPostRequest(content, url, cb) {
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", url, true);
    xhttp.withCredentials = true;
    xhttp.setRequestHeader("Authorization", "Basic " + btoa("NAME:PASS"));

    //DIFF
    xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    var params = JSON.stringify(content);
    //DIFF

    xhttp.onreadystatechange = function () {
        if (xhttp.readyState === 4 && xhttp.status === 200) {
            if (cb) {
                cb(JSON.parse(xhttp.response));
            }
        }
    };
    xhttp.send(params);//DIFF
}
但是如果我将zip添加到数组中,JSON.stringify函数将删除zip文件。我可能需要将其转换为字节数组

如何向解决方案1中添加元数据,或者如何在解决方案2中将zip转换为字节数组?

我还没有实际测试过这一点,因为我不知道确切的值<代码>内容是什么类型的,所以很难构造一个合适的测试用例

您正试图在一个请求中发送JSON文件和Zip文件。实现这一点的方法是使用多部分请求

XMLHttpRequest
可以从
FormData
对象构造多部分请求

您只需要创建一个并向其提供正确的数据

var zip_data = get_zip_data();
var json_data = get_json_data();

var zip_file = new File(zip_data, "example.zip", { type: "application/zip" });
var json_file = new File(json_data, "example.json", { type: "application/json" });

var form_data = new FormData();
form_data.append("zip", zip_file, "example.zip");
form_data.append("json", json_file, "example.json");

var xhttp = new XMLHttpRequest();
xhttp.open("POST", url);
xhttp.withCredentials = true;
xhttp.setRequestHeader("Authorization", "Basic " + btoa("NAME:PASS"));
xhttp.addEventListener("load", load_handler);
xhttp.send(form_data);

function load_handler() {
    if (cb) {
        cb(JSON.parse(xhttp.response));
    }
}
请注意,您不能设置内容类型标题。XHR将从
FormData
对象自动生成它(它必须这样做,因为它需要在文件之间生成边界标记)


这将导致将这两个文件发送到服务器,就像您以常规形式使用
拾取它们一样。相应地编写服务器端代码(例如,如果您使用的是PHP,请使用
$\u文件
,如果您使用的是Node.js,请使用类似multer的东西)。

什么类型的元数据?说明您需要发送此元数据的文档在哪里?最好的猜测是,您将添加一个自定义标题,如
授权
内容类型
标题,但需要先查看文档。我想在一个POST请求中发送一个zip文件、一个数字和一个字符串。没有文档。您需要使用
FormData
。谢谢你。