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

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请求体

    1. 生成一个唯一的边界字符串(boundary),用来分隔请求体中的不同部分,用GUID生成最稳妥:
      Boundary := '----' + GUIDToString(TGUID.NewGuid);
      
    2. 设置请求的Content-Type,带上边界字符串:
      RESTRequest1.Body.ContentType := 'multipart/form-data; boundary=' + Boundary;
      
    3. 读取要上传的文件内容,手动拼接请求体的各个部分——必须包含文件名信息,服务器才能正确识别:
      完整示例代码如下:
      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;
      

关键注意事项

  • 边界字符串要保证唯一,避免和文件内容中的字符重复,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:30