代码之家  ›  专栏  ›  技术社区  ›  graceyin

如何将zip文件编码为多部分/表单数据的一部分

  •  0
  • graceyin  · 技术社区  · 7 年前

    因此,我正在创建我的请求主体,如下所示:

    var form_string = "\n--abcdefghijklmnop\nContent-Disposition: form-data; filename=\"" + filename + "\"; name=\"file\";\nContent-Type:application/octet-stream;\nContent-Transfer-Encoding:base64;\n\n" + data;
    form_string += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"token\";\n\n" + token;
    form_string += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"filetype\";\n\n" + filetype;
    form_string += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"filename\";\n\n" + filename;
    form_string += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"channels\";\n\n" + channel;
    form_string += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"title\";\n\n" + title;
    form_string += "\n--abcdefghijklmnop--";
    
    var form = Buffer.from(form_string, "utf8");
    
    var headers = {
      "Content-Type": "multipart/form-data; boundary=abcdefghijklmnop",
      "Content-Length": form.length,
      "Authorization": "Bearer ....."
    };
    var options = {
      "headers": headers,
      "body": form 
    };
    // using the sync-request node module. 
    var res = request("POST", url, options);
    
    var res = request("POST", url, options);
    

    (我试过了 application/zip application/x-zip-compressed 也我还尝试了二进制和base64内容传输编码。)

    我创建了一个非常小的zip文件作为测试。其base64编码如下:

    UEsDBAoAAAAAAAqR+UoAAAAAAAAAAAAAAAAIABwAdGlueXppcC9VVAkAA1PBd1mDwXdZdXgLAAEE9QEAAAQUAAAAUEsDBAoAAAAAAAuR+Up6em/tAwAAAAMAAAAQABwAdGlueXppcC90aW55LnR4dFVUCQADVsF3WVzBd1l1eAsAAQT1AQAABBQAAABoaQpQSwECHgMKAAAAAAAKkflKAAAAAAAAAAAAAAAACAAYAAAAAAAAABAA7UEAAAAAdGlueXppcC9VVAUAA1PBd1l1eAsAAQT1AQAABBQAAABQSwECHgMKAAAAAAALkflKenpv7QMAAAADAAAAEAAYAAAAAAABAAAApIFCAAAAdGlueXppcC90aW55LnR4dFVUBQADVsF3WXV4CwABBPUBAAAEFAAAAFBLBQYAAAAAAgACAKQAAACPAAAAAAA=

    UEsDBAoAAAAAAArCkcO5SgAAAAAAAAAAAAAAAAgAHAB0aW55emlwL1VUCQADU8OBd1nCg8OBd1l1eAsAAQTDtQEAAAQUAAAAUEsDBAoAAAAAAAvCkcO5Snp6b8OtAwAAAAMAAAAQABwAdGlueXppcC90aW55LnR4dFVUCQADVsOBd1lcw4F3WXV4CwABBMO1AQAABBQAAABoaQpQSwECHgMKAAAAAAAKwpHDuUoAAAAAAAAAAAAAAAAIABgAAAAAAAAAEADDrUEAAAAAdGlueXppcC9VVAUAA1PDgXdZdXgLAAEEw7UBAAAEFAAAAFBLAQIeAwoAAAAAAAvCkcO5Snp6b8OtAwAAAAMAAAAQABgAAAAAAAEAAADCpMKBQgAAAHRpbnl6aXAvdGlueS50eHRVVAUAA1bDgXdZdXgLAAEEw7UBAAAEFAAAAFBLBQYAAAAAAgACAMKkAAAAwo8AAAAAAA==

    有人能解释一下这里正在进行什么编码,以及我如何正确地将文件上传到Slack吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tanaike    7 年前

    下面的示例脚本怎么样?这种情况有两种模式。

    为此,我修改了您尝试的方法。您可以通过如下转换为字节数组来上载zip文件。首先,它构建 form-data 。它添加转换为字节数组的zip文件,并 boundary 使用 Buffer.concat()

    var fs = require('fs');
    var request = require('request');
    var upfile = 'sample.zip';
    fs.readFile(upfile, function(err, content){
        if(err){
            console.error(err);
        }
        var token = '### access token ###';
        var filetype = 'zip';
        var filename = 'samplefilename';
        var channel = 'sample';
        var title = 'sampletitle';
        var formString = "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"token\";\n\n" + token;
        formString += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"filetype\";\n\n" + filetype;
        formString += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"filename\";\n\n" + filename;
        formString += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"channels\";\n\n" + channel;
        formString += "\n--abcdefghijklmnop\nContent-Disposition: form-data; name=\"title\";\n\n" + title;
        formString += "\n--abcdefghijklmnop\nContent-Disposition: form-data; filename=\"" + upfile + "\"; name=\"file\";\nContent-Type:application/octet-stream;\n\n";
        var options = {
            method: 'post',
            url: 'https://slack.com/api/files.upload',
            headers: {"Content-Type": "multipart/form-data; boundary=abcdefghijklmnop"},
            body: Buffer.concat([
                Buffer.from(formString, "utf8"),
                new Buffer(content, 'binary'),
                Buffer.from("\n--abcdefghijklmnop\n", "utf8"),
            ]),
        };
        request(options, function(error, response, body) {
            console.log(body);
        });
    });
    

    示例脚本2:

    这是一种比示例1更简单的方法 fs.createReadStream() 作为上传到Slack的文件。

    var fs = require('fs');
    var request = require('request');
    request.post({
        url: 'https://slack.com/api/files.upload',
        formData: {
            file: fs.createReadStream('sample.zip'),
            token: '### access token ###',
            filetype: 'zip',
            filename: 'samplefilename',
            channels: 'sample',
            title: 'sampletitle',
        },
    }, function(error, response, body) {
        console.log(body);
    });
    

    示例1和示例2都可以上传zip文件到Slack,如下所示。对于两者,即使 filetype 未定义,上载的文件自动用作zip文件。

    enter image description here

    如果我误解了你的问题,对不起。