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

添加MVCConsumes(MULTIPART_FORM_DATA)后DelphiMVCFramework路由丢失问题排查

问题原因

DMVCFramework 3.4.2版本对[MVCConsumes]特性采用精确字符串匹配逻辑,而非HTTP规范中的媒体类型模糊匹配。当你指定TMVCMediaType.MULTIPART_FORM_DATA时,对应的字符串是multipart/form-data,但实际Postman发送的请求中,Content-Type会自动带上boundary参数(比如multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW),框架无法匹配带额外参数的Content-Type,因此返回404路由未找到。

解决方案

方法1:使用媒体类型通配符匹配

将[MVCConsumes]的参数改为multipart/*,只要请求的Content-Type属于multipart类型(无论是否带boundary参数),都能匹配到该路由:

type
  [MVCPath('/api')]
  TMyController = class(TMVCController)
  public
    [MVCPath('/upload')]
    [MVCHTTPMethod([httpPOST])]
    [MVCConsumes('multipart/*')] // 替换为通配符匹配
    procedure Upload;
  end;

方法2:完善文件上传处理逻辑

在Upload方法中,通过Context.Request.Files获取上传的文件,示例代码:

procedure TMyController.Upload;
var
  LFile: TMVCHttpFile;
begin
  if Context.Request.Files.Count = 0 then
  begin
    raise EMVCException.Create('No file uploaded', HTTP_STATUS.BadRequest);
  end;

  LFile := Context.Request.Files[0];
  // 示例:保存文件到本地路径
  LFile.SaveToFile('C:\Uploads\' + LFile.FileName);
  
  Context.Response.StatusCode := HTTP_STATUS.OK;
  Context.Response.ContentText := Format('File %s uploaded successfully', [LFile.FileName]);
end;

额外验证要点

确认Postman的请求设置:

  • 请求方法为POST
  • 请求体类型选择form-data
  • 添加文件字段(Key设为任意名称,Type选择File,Value选择要上传的文件)
  • 不要手动修改Content-Type,让Postman自动生成带boundary的Content-Type

内容的提问来源于stack exchange,提问作者Matthias B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:46:01