You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何向接收文件的POST接口发送JSONL字符串?

解决方案:Angular上传OpenAI文件报"file是必填参数"的修复

核心问题:手动设置Content-Type导致FormData解析失败

你手动在请求头里指定了'Content-Type': 'multipart/form-data',但Angular的HttpClient在发送FormData时,会自动生成包含boundary的Content-Type头(比如multipart/form-data; boundary=----WebKitFormBoundaryXXX)。手动设置固定的Content-Type会丢失boundary信息,导致OpenAI后端无法正确解析FormData中的file和purpose字段,因此返回"file是必填参数"的错误。

修改后的代码

移除httpOptions里的Content-Type配置即可:

UploadFile(token: string, file: string): Observable<TrainingFiles> {
    let fileblob = new Blob([file], {
      type: 'text/plain; charset=utf8',
    });

    let body = new FormData();
    body.append('purpose', 'fine-tune');
    body.append('file', fileblob, 'myTrainingFile.jsonl');

    let httpOptions = {
      headers: new HttpHeaders({
        Authorization: 'Bearer ' + token,
        // 移除手动设置的Content-Type,让HttpClient自动处理
      }),
    };

    return this.http.post<TrainingFiles>(
      'https://api.openai.com/v1/files',
      body,
      httpOptions
    );
  }

额外优化:直接请求Blob避免字符串转码问题

你当前先把文件内容转成字符串再转Blob,可能会遇到编码问题(比如JSONL里的特殊字符)。建议在获取服务器上的文件时,直接请求Blob类型,跳过中间的字符串转换:

// 先获取服务器上的文件为Blob
getServerFile(fileUrl: string): Observable<Blob> {
  return this.http.get(fileUrl, { responseType: 'blob' });
}

// 然后上传至OpenAI
uploadToOpenAI(token: string, fileBlob: Blob): Observable<TrainingFiles> {
  const formData = new FormData();
  formData.append('purpose', 'fine-tune');
  formData.append('file', fileBlob, 'myTrainingFile.jsonl');

  return this.http.post<TrainingFiles>(
    'https://api.openai.com/v1/files',
    formData,
    { headers: new HttpHeaders({ Authorization: 'Bearer ' + token }) }
  );
}

验证要点

  • 检查浏览器请求头:确认Content-Type是自动生成的带boundary的格式,与Postman成功请求的格式一致
  • 确保Blob的MIME类型正确:对于JSONL文件,使用application/jsonl或text/plain均可,OpenAI均支持

内容的提问来源于stack exchange,提问作者charles lesoil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:30:36