delphi TCustomRESTRequest.AddFile()试图将我的文件名转换为Int64

wkyowqbh  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(197)

我尝试上传一个文档到api。api的所有者给我他的C#代码上传一个文档:

var client = new 
RestClient("hisurl");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "multipart/form-data");
request.AddHeader("v", "4.2");
request.AddHeader("j_token", "histoken");
request.AddFile("file", "/C:/Users/olivm/Documents/QA API Swagger/smartpacte2.pdf","application/.pdf");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

我决定也使用TCustomRESTRequest.AddFile()方法,所以下面是我的代码:

procedure AttachDocument(contract_id : Integer; pathFile : String);
  var 
    RESTClient : TRESTClient;
    RESTRequest : TCustomRESTRequest;
    Response : TCustomRESTResponse;
  begin
    RESTClient := TRESTClient.Create('');
    RESTRequest := TCustomRESTRequest.Create(nil);
    try
      RESTClient.BaseURL := 'myurl';
      RESTRequest.Client := RESTClient;
      RESTRequest.Accept := 'application/json';
      RESTRequest.Params.AddHeader('j_token','mytoken',[poDoNotEncode]);
      RESTRequest.Method := rmPOST;
      RESTRequest.AddFile('file',pathFile);
      RESTRequest.Execute; 
      Response := RESTRequest.Response;
      ShowMessage(Response.Content);
    finally
      RESTRequest.Free;
      RESTClient.Free;
    end;
  end;

但这会导致错误:
运行时间错误:无法将类型(UnicodeString)的变量转换为类型(Int64)
实际上,TCustomRESTRequest.AddFile()方法似乎希望我的pathFile作为第一个参数,Int64作为第二个参数,如下所示:

RESTRequest.AddFile(pathFile,0);

我也试过这个:

RESTRequest.AddFile(pathFile,ctAPPLICATION_PDF);

但是每次我从api得到这个错误:
{"错误":"未找到文件"}
你知道如何实现这个功能吗?另外,你见过这种TCustomRESTRequest.AddFile()方法吗?

ghhkc1vu

ghhkc1vu1#

您没有正确调用TRESTRequest.AddFile函数,并且给了它错误的参数。这个函数非常适合在请求中轻松发送文件,只需指定文件在本地驱动器或存储器上的路径及其内容类型(MIME类型有很多种)。
正如您在DocWiki中所读到的,此函数有两个重载版本:

  • 第一个版本(参数为:字符串形式的文件名、字符串形式的文件路径、枚举数形式的内容类型)允许您在同一请求中发送多个文件,方法是在AName参数中指定一个唯一的名称,用于标识请求内容中的文件(类似于HTML表单的“"Input"”元素中的"“Name"”属性),以便您可以在同一请求中发送具有不同内容类型的多个文件,而不会有覆盖的风险。
  • 第二个版本(参数:文件路径为字符串,内容类型为枚举器),让你在请求中只发送一个文件。如果这个函数被第二次执行,那么以前的内容会被新的内容替换。

文件名字符串是其在本地存储上的路径,它是一个字符串。
要指定内容类型,必须像 Delphi 枚举器那样编写枚举器参数:TRESTContentType.ctAPPLICATION_PDF
下面是发送PDF文件的工作调用示例:

RESTRequest1.AddFile('File1', 'C:\Doc1.pdf', TRESTContentType.ctAPPLICATION_PDF);

有关更多信息,您可以查看这些DocWiki链接:

相关问题