使用RestSharp如何上传多个文件?

3

我想上传文件到这个API:https://support.crowdin.com/api/add-file/

如何使用RestSharp创建一个名为files的参数并将多个文件添加到其中?

我目前编写了以下代码,但它不起作用,RestSharp似乎没有按预期上传文件。

        var addUrl = new Uri($"https://api.crowdin.com/api/project/{projectIdentifier}/add-file?key={projectKey}&json=");


        var restClient = new RestSharp.RestClient("https://api.crowdin.com");
        var request = new RestSharp.RestRequest($"api/project/{projectIdentifier}/add-file", RestSharp.Method.POST);
        request.AlwaysMultipartFormData = true;

        request.AddQueryParameter("key", projectKey);
        request.AddQueryParameter("json", "");

        var files = new Dictionary<string, byte[]>
        {
            { "testfile", File.ReadAllBytes(fileName) }
        };
        request.AddParameter("files", files, RestSharp.ParameterType.RequestBody);

        var restResponse = restClient.Execute(request);

这让我感到:
{
  "success":false,
  "error":{
    "code":4,
    "message":"No files specified in request"
  }
}

@SirRufo 您链接的问题是关于添加单个文件的。而这个问题是关于添加一个文件数组的,这并不是一件简单的事情。 - Riki
有一个回答(6个赞)提供了添加两个文件的示例。 - Sir Rufo
答案是直接将两个文件添加到请求中,而我的情况更加复杂。我需要将多个文件添加到名为“files”的“数组”中。(因此我需要对数组名称进行控制)。 - Riki
你需要向API发送一个Multipart/form请求。每个字段都需要一个唯一的名称。字段名称可能包含方括号。接收方可以将带有方括号的字段解释为数组。你明白了吗? - Sir Rufo
@SirRufo 那确实是我唯一遗漏的东西。至少对我来说,这一点完全不明显。非常感谢!我会编辑我的帖子,详细解释出了什么问题。 - Riki
1个回答

15

@SirRufo在评论中提到了解决方案,但没有将其作为解决方案发布,因此我将在此解释。

实际上,http POST方法没有数组的概念。 而在字段名称中使用方括号只是一种惯例。

这个示例代码可以工作:

        var restClient = new RestSharp.RestClient("https://api.crowdin.com");
        var request = new RestSharp.RestRequest($"api/project/{projectIdentifier}/add-file", RestSharp.Method.POST);
        request.AlwaysMultipartFormData = true;
        request.AddHeader("Content-Type", "multipart/form-data");

        request.AddQueryParameter("key", projectKey);
        request.AddQueryParameter("json", "");

        request.AddFile("files[testfile1.pot]", fileName);
        request.AddFile("files[testfile2.pot]", fileName);

        // Just Execute(...) is missing ...

不需要嵌套自定义参数或其他复杂的内容。

只需使用这种“特殊”的命名格式添加文件即可。

我的错误在于认为files[filenamehere.txt]部分意味着需要比实际需要更复杂的POST正文。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接