当前位置: 首页 > 知识库问答 >
问题:

如何手工创建多物料/表单数据

从焱
2023-03-14

我们可以使用bodymixin的.formData()在Chromium(Chrome)60+和Firefox 39+上返回数据formData表示

相关规格:

  • 7.2多部分内容类型
  • 从表单返回值:multipart/form-data

勘误表

  • 说明bytes、FormData和Multipart/Form-Data MIME type#392的Body package数据算法
  • 记录多部分/表单-数据表单字段文件上载的实际处理#3040

相关

  • 多部分HTTP响应
  • 未定义FormData时如何在Web Workers中上载文件

如何在客户端和服务器端使用JavaScript手动创建multipart/form-data以将multipart/form-data作为响应?

共有2个答案

狄雅珺
2023-03-14

您可以编写自己的FormData polyfill或只在google上使用“FormData polyfill”),也可以在浏览器Chrome、FireFox、Opera、Safari、IE(10+)和Edge上使用普通的FormData。FormData polyfill仅对旧的IE和工人有用,但对于工人,您最好使用这个-https://gist.github.com/rob--w/8b5adedd84c0d36aba64

维基百科

标准格式数据不属于正文

你需要做什么?您想发送formdata还是在JS接收它?

你可以试着用我的polyfill,但我没有测试过。

示例

var data = new RawFormData();
data.append("key","value")
data.append("key", new Blob("test"), "my file.txt");
data.getOutputDeferred().then(function(formData){
    var xml = new XMLHttpRequest();
    xml.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.getBoundry());
    xml.setRequestHeader("Content-Length", formData.length);
    xml.open(method, url);
    xml.send(formData);
});

代码:

/**
* @constructor
*/
RawFormData = function () {
    this._promises = [];
    this._boundry = this.makeBoundary();
};

/**
* @return {string}
*/
RawFormData.prototype.getBoundary = function () {
    return this._boundry;
}

/**
* @return {string}
*/
RawFormData.prototype.makeBoundary = function () {
    return 'MyBoundary' + window.btoa(Math.random().toString()).substr(0, 12);
};

/**
* @param {string} name
* @param {string|number|File|Blob|boolean|null|undefined} val
* @param {string=} filename
*/
RawFormData.prototype.append = function (name, val, filename) {
    var prom = null;

    if(val instanceof File || val instanceof Blob){
        prom = this.readAsBinaryString(val).then(function(base64){
            var contentType = val.type || 'application/octet-stream';
            var result = '--' + this._boundry + '\r\n' +
                'Content-Disposition: form-data; ' +
                'name="' + name + '"; filename="' + this.encode_utf8(filename || "blob") + '"\r\n' +
                'Content-Type: ' + contentType + '\r\n\r\n' +
                base64 + '\r\n';
            return result;
        }.bind(this))
    }else{
        prom = new Promise(function(resolve){
            return '--' + this._boundry + '\r\n' +
                'Content-Disposition: form-data; ' +
                'name="' + this.encode_utf8(name) + '"\r\n\r\n' +
                this.encode_utf8(val) + '\r\n'
        }.bind(this));
    }

    this._promises.push(prom);

    return prom;
};
/**
* @return {File|Blob} blob
* @return {Promise<string>}
*/
RawFormData.prototype.readAsBinaryString = function (blob) {
        var reader = new FileReader();
        return new Promise(function(resolve,reject){
            var binStringCallback = function (e) {
                resolve(e.target.result);
            };

            var arrBufferCallback = function (e) {
                var binary = "";
                var bytes = new Uint8Array(e.target.result);
                var length = bytes.byteLength;
                for (var i = 0; i < length; i++) {
                    binary += String.fromCharCode(bytes[i]);
                }
                resolve(binary);
            };

            reader.onerror = reader.onabort = function () {
                resolve(null);
            };

            if (typeof reader.readAsBinaryString != "undefined") {
                reader.onload = binStringCallback;
                reader.readAsBinaryString(blob);
            } else {
                reader.onload = arrBufferCallback;
                reader.readAsArrayBuffer(blob);
            }
        });
};

RawFormData.prototype.encode_utf8 = function( s ){
   return unescape( encodeURIComponent( s ) );
}

RawFormData.prototype.getOutputDeferred = function () {
    return Promise.all(this._promises).then(function (rows) {
        var output = '--' + this._boundry + '\r\n';
        rows.forEach(function(row) {
            output += row;
        });
        output += '--' + this._boundry + '\r\n';
        return output;
    }.bind(this));
};
祁柏
2023-03-14

您可以使用XMLHttpRequest手动创建multipart/form-data

function multiPost(method, url, formHash){
    var boundary = "nVenJ7H4puv"
    var body = ""
    for(var key in formHash){
        body += "--" + boundary
             + "\r\nContent-Disposition: form-data; name=" + formHash[key].name
             + "\r\nContent-type: " + formHash[key].type
             + "\r\n\r\n" + formHash[key].value + "\r\n"
    }
    body += "--" + boundary + "--\r\n"

    var xml = new XMLHttpRequest();
    xml.open(method, url)
    xml.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary)
    xml.setRequestHeader("Content-Length", body.length)
    xml.send(body)
}
 类似资料:
  • 我正在创建一个扩展,该扩展通过使用Codenvy提供的REST API来实现过程的自动化。然而,我遇到了多部分/表单数据POST请求的麻烦。具体地说,就是创建一个新工厂。 这是我的Ajax/jQuery调用: 但我得到一个409错误的消息: 在多部分/表单-数据的“工厂URL”部分中找不到工厂URL信息 我已经在Codenvy论坛上发了帖子,但我得到的唯一有用的东西是一个curl命令

  • 所以我在一个react项目中有一个材料表,默认的过滤选项只是在数据上方放一行,你可以在上面输入任何你想要的内容。我需要的是在表格上面做一个按钮,我可以点击,然后点击复选框来选择我想要过滤掉的内容。我想知道是否有一种方法可以通过修改material-table提供给您的内容来做到这一点,或者我是否应该将复选框选项链接到一个函数,该函数将再次获取数据并用.filter将它们过滤掉?这似乎是一个很长的距

  • TextField框材质设计截图 我也附上链接,有材料设计指导方针,如果图像不够清晰。我只需要创建一个文本字段框,但我想不通。这里是材料设计指南页面的链接 https://material.io/guidelines/components/text-fields.html#text-fields-text-fields-boxs 还附加了我要创建的文本字段的xml代码。 提前道谢。好心的帮助。

  • 本文向大家介绍Bootstrap如何创建表单,包括了Bootstrap如何创建表单的使用技巧和注意事项,需要的朋友参考一下 Bootstrap表单类型分为三种格式:垂直或基本表单、内联表单、水平表单。 垂直或基本表单(display:block;) 基本的表单结构是 Bootstrap 自带的,个别的表单控件自动接收一些全局样式。下面列出了创建基本表单的步骤: 向父 <form> 元素添加 rol

  • 我需要在Cms后端表单(fields.yaml)中创建一个多选表单字段。我采用了以下方法 选择_字段: 此字段的选项将从模型中调用 一切正常,但当我提交表单时,只有第一个选择的选项作为JSON数据插入到数据库表文本字段中。我希望存储每个选定的选项。我也在模型中声明该字段为Jsonable,即受保护的$Jsonable=['field_name']; 注意:当我使用类型作为检查框列表时,它像我想的那

  • 问题内容: 谁能给我一个带有多维输入数组的JavaScript示例/示例?希望您能有所帮助,因为我还是JavaScript的新手。 就像输入2行2列时一样,输出将是2行输入和2列输入。 像这样: 问题答案: http://jsfiddle.net/z4Un3/ 如果您想存储DOM元素,请执行以下操作: 在附加这些元素之前,无法确定上面的方法是否有用。以下可能是您正在寻找的更多内容: http://