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
相关产品推荐
相关产品推荐

