FormData 如何在多部分/表单数据中获取或设置边界 - Angular

新手上路,请多包涵

我有一个迷你应用程序,我必须在其中将表单数据从浏览器发布到端点。

这是我的帖子:

 var formData = new FormData();
formData.append('blobImage', blob, 'imagem' + (new Date()).getTime());

return $http({
  method: 'POST',
  url: api + '/url',
  data: formData,
  headers: {'Content-Type': 'multipart/form-data'}
})

边界似乎是由 formData 添加到参数中的,但是,我无法让它在标题中发送,我应该怎么做?

原文由 Pablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 404
2 个回答

好吧,似乎标题 ContentType 应该是未定义的,以便添加正确的边界

原文由 Pablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

正确的方法是不设置 Content-Type 标头。

例子:

 import { http } from '@angular/common/http'

function sendPostData(form: FormData) {
  const url = `https://post-url-example.com/submit`;
  const options = {
    headers: new HttpHeaders({
      Authorization: `Bearer auth-token`
    })
  };

  return http.post(url, form, options);
}

进一步添加 Pablo 的答案

当 http 请求正文具有 FormData 类型时,angular 将推迟 Content-Type 标头分配给浏览器。 detectContentTypeHeader() 将返回 nullFormData 请求正文和角度不会设置请求标头。

这是在 @angular/commons/http/src/xhr.ts 模块上。

   // Auto-detect the Content-Type header if one isn't present already.
  if (!req.headers.has('Content-Type')) {
    const detectedType = req.detectContentTypeHeader();
    // Sometimes Content-Type detection fails.
    if (detectedType !== null) {
      xhr.setRequestHeader('Content-Type', detectedType);
    }
  }

基于请求体的内容类型检测:

   detectContentTypeHeader(): string|null {
    // An empty body has no content type.
    if (this.body === null) {
      return null;
    }
    // FormData bodies rely on the browser's content type assignment.
    if (isFormData(this.body)) {
      return null;
    }
    // Blobs usually have their own content type. If it doesn't, then
    // no type can be inferred.
    if (isBlob(this.body)) {
      return this.body.type || null;
    }
    // Array buffers have unknown contents and thus no type can be inferred.
    if (isArrayBuffer(this.body)) {
      return null;
    }
    // Technically, strings could be a form of JSON data, but it's safe enough
    // to assume they're plain strings.
    if (typeof this.body === 'string') {
      return 'text/plain';
    }
    // `HttpUrlEncodedParams` has its own content-type.
    if (this.body instanceof HttpParams) {
      return 'application/x-www-form-urlencoded;charset=UTF-8';
    }
    // Arrays, objects, and numbers will be encoded as JSON.
    if (typeof this.body === 'object' || typeof this.body === 'number' ||
        Array.isArray(this.body)) {
      return 'application/json';
    }
    // No type could be inferred.
    return null;
  }

资源:

原文由 Raynal Gobel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题