RAD Studio XE7无AddFile时,如何用TRESTRequest实现文件上传?
在RAD Studio XE7中用TRESTRequest实现带文件名的multipart/form-data文件上传
没问题,完全可以实现。虽然XE7版本的TRESTRequest没有内置的AddFile()方法,但我们可以手动构造multipart/form-data格式的请求体,同时保留你现有的Token认证逻辑。具体操作如下:
核心操作步骤
配置基础请求属性
把TRESTRequest的Method设为rmPOST,指定好上传接口的Resource路径,现有Token认证的配置(比如通过Parameters添加Authorization头)保持不变即可。构造multipart/form-data请求体
- 生成一个唯一的边界字符串(boundary),用来分隔请求体中的不同部分,用GUID生成最稳妥:
Boundary := '----' + GUIDToString(TGUID.NewGuid); - 设置请求的Content-Type,带上边界字符串:
RESTRequest1.Body.ContentType := 'multipart/form-data; boundary=' + Boundary; - 读取要上传的文件内容,手动拼接请求体的各个部分——必须包含文件名信息,服务器才能正确识别:
完整示例代码如下:var Boundary: string; FileStream: TFileStream; BodyStream: TStringStream; FileContent: TBytes; TargetFileName: string; begin // 基础请求配置 RESTRequest1.Method := rmPOST; RESTRequest1.Resource := '/api/file/upload'; // 保留你的Token认证逻辑,比如添加Authorization头 RESTRequest1.Parameters.AddHeader('Authorization', 'Bearer ' + YourAuthToken); // 生成边界字符串 Boundary := '----' + GUIDToString(TGUID.NewGuid); RESTRequest1.Body.ContentType := 'multipart/form-data; boundary=' + Boundary; // 准备要上传的文件信息 TargetFileName := 'example.txt'; FileStream := TFileStream.Create('C:\path\to\example.txt', fmOpenRead or fmShareDenyWrite); try SetLength(FileContent, FileStream.Size); FileStream.ReadBuffer(FileContent[0], FileStream.Size); finally FileStream.Free; end; // 拼接请求体 BodyStream := TStringStream.Create; try // 写入文件部分的头部,这里必须指定filename参数 BodyStream.WriteString('--' + Boundary + #13#10); BodyStream.WriteString(Format('Content-Disposition: form-data; name="file"; filename="%s"'#13#10, [TargetFileName])); BodyStream.WriteString('Content-Type: text/plain'#13#10#13#10); // 根据文件类型调整MIME // 写入文件二进制内容 BodyStream.WriteBuffer(FileContent[0], Length(FileContent)); // 写入结尾的边界标记 BodyStream.WriteString(#13#10 + '--' + Boundary + '--'#13#10); // 将拼接好的流赋值给请求体 RESTRequest1.Body.Clear; RESTRequest1.Body.SetStream(BodyStream, ctMULTIPART_FORM_DATA, True); except BodyStream.Free; raise; end; // 执行上传请求 RESTRequest1.Execute; end;
- 生成一个唯一的边界字符串(boundary),用来分隔请求体中的不同部分,用GUID生成最稳妥:
关键注意事项
- 边界字符串要保证唯一,避免和文件内容中的字符重复,用GUID生成是最省心的方式
- 文件的
Content-Type要根据实际文件类型设置,比如图片用image/jpeg,PDF用application/pdf,不确定的话可以用application/octet-stream - 请求体中的换行必须用
#13#10(CRLF),符合HTTP规范,否则服务器可能解析失败 - 如果需要同时传递其他表单字段,只需要在请求体中添加额外的part即可,格式参考文件部分的头部,比如:
--边界字符串 Content-Disposition: form-data; name="description" 这是上传的测试文件
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

