未设置$ http post multipart / form-data boundary

时间:2016-05-12 21:02:46

标签: angularjs node.js html5 http

我正在为下面的帖子调用设置边界,但是在chrome上,边界看起来与我设置的边界不同。如何让我的自定义边界“--test”显示在请求有效负载上?

    var url = '/site/apkUpload';
    var deferred = $q.defer();
    console.log(formdata);
    $http.post(url, formdata, {
        processData: false,
        headers: {'Content-Type': "multipart/form-data;  charset=utf-8; boundary='--test'",
            'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            'x-access-token': token,
            'cache-control': 'max-age=0'}
    })
        .success(function (response) {
            deferred.resolve(response);
        })
        .error(function (reject) {
            deferred.reject(reject);
        });
    return deferred.promise;

请求chrome上的有效负载:

------ WebKitFormBoundaryB5LjM2a6Qly3Xruj 内容处理:表格数据; NAME = “软件包名”

helo1 ------ WebKitFormBoundaryB5LjM2a6Qly3Xruj 内容处理:表格数据;名称= “名称”

...

非常感谢!

1 个答案:

答案 0 :(得分:0)

我可以用两种方式解释你的问题:

  1. 您正在谈论为什么您没有在POST请求标头中获得 ------ WebKitFormBoundaryB5LjM2a6Qly3Xruj ,这是您在请求有效负载中获得的。使用 $ http.post (我也使用FormData)发送多部分formdata时遇到了同样的问题。解决方法是使用 $ http( config 。我的理解 $ http.post 底层使用 $ http()本身生成XMLHttpRequest对象,该对象应运行< em> multipart / form-data encoding算法用于设置有效负载和标头中的多部分边界。在 $ http.post 中,无论何时提供自定义配置对象,它都会覆盖算法生成的标头。 This回答也很有帮助。
  2. 如果您只想在内容标题中添加自定义多部分边界,则可以通过在配置对象中添加tranformRequest函数来实现:

    var url = '/site/apkUpload';
    var deferred = $q.defer();
    console.log(formdata);
    $http.post(url, formdata, {
        processData: false,
        transformRequest: function (data, headers) {
            var boundary = yourCustomLogic();
            headers()['Content-Type'] = 'multipart/form-data;charset=utf-
            8;boundary=' + boundary;
        },
        'Accept': ...,
        'x-access-token': token,
        'cache-control': 'max-age=0'
    })
    .success( function () {...});