C#Rest API文件上传

C#Rest API文件上传,c#,rest,api,C#,Rest,Api,我也尝试通过API上传一个带有C#的文件 StreamUtils不起作用,我收到错误:“无法将lambda表达式转换为'string'类型,因为它不是委托类型” 你知道怎么上传文件吗? 大约是100MB public void UploadModel(string ProjectId, string filename, Stream fileStream) { string access_token_string = Read_Json_Values(

我也尝试通过API上传一个带有C#的文件

StreamUtils不起作用,我收到错误:“无法将lambda表达式转换为'string'类型,因为它不是委托类型”

你知道怎么上传文件吗? 大约是100MB

 public void UploadModel(string ProjectId, string filename, Stream fileStream)
        {

            string access_token_string = Read_Json_Values("access_token");
            string webstring = String.Format("https://api.test.com/v2/projects/{0}/revisions", ProjectId);

            var client = new RestClient(webstring);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Authorization", "Bearer " + access_token_string);
            request.AddHeader("Content-Type", "application/ifc");
            request.AddHeader("xxx-Params", "{\"callbackUri\": \"https://example.com\", \"filename\": \"mk337.ifc\", \"comment\": \"From Postman\", \"model\": \"21312312312312\"}");
            request.AddFile("file", s => StreamUtils.CopyStream(fileStream, s), filename);


            IRestResponse response = client.Execute(request);
            Console.WriteLine("Model is uploaded!");
        }

我认为您可以将输入文件转换为Base64,然后发送它。
另请参阅其他教授的答案,了解他们的想法。

因此,您的代码中有两个问题

1。Lambda表达式问题

下一行导致lambda表达式问题

request.AddFile("file", s => StreamUtils.CopyStream(fileStream, s), filename);

// This is the function you want to call
void CopyStream(Stream source, Stream target)
所以问题是

s => StreamUtils.CopyStream(fileStream, s)
是Lambda表达式,其中定义s并将s作为第二个参数指定给

CopyStream(Stream source, Stream target)
但是s不是Stream类型。这就是为什么你会有例外

2。request.AddFile需要参数

假设您在REST请求中使用RestSharp NuGet包(我假设因为类看起来像RestSharp中的once),您应该查看RestRequest.AddFile()的不同重载:

因此,如果我们将其与代码中的行进行比较

request.AddFile("file", s => StreamUtils.CopyStream(fileStream, s), filename);
我们看到您给出了以下参数:

  • “文件”作为名称
  • 字节的函数调用(Lambda表达式)
  • 文件名的Filename变量
第一个和第三个参数看起来不错,但第二个参数是个问题

我的建议:

在UploadModel中定义secound stream参数并将其传递给CopyStream函数:

public void UploadModel(string ProjectId, string filename, Stream sourceStream, Stream targetStream)
{
    // .... your code still here, just want to show the changing lines
    request.AddFile("file", StreamUtils.CopyStream(sourceStream, targetStream), filename);
}
如果仍要调用StreamUtils.CopyStream()来获取request.AddFile的第二个参数,则必须更改函数定义,因为它当前返回void。因此,不是:

public static void CopyStream(Stream source, Stream target)
public static void CopyStream(Stream source, Stream target, byte[] buffer)
你必须把它改成

public static byte[] CopyStream(Stream source, Stream target)
public static byte[] CopyStream(Stream source, Stream target, byte[] buffer)
这就导致了函数体本身的变化,因为我们现在必须根据函数定义返回一个字节[](这只是一个示例,仍然需要得到我目前无法实现的实际实现,希望它能给您一个如何实现的印象):


通过这些更改,它应该可以工作。

我可以假设这一行
request.AddFile(“file”,s=>StreamUtils.copyream(fileStream,s),filename)引发异常,但需要澄清。行request.AddFile(“file”,s=>StreamUtils.CopyStream(fileStream,s),filename)导致问题,因为“s=>StreamUtils.CopyStream(fileStream,s)”是lambda表达式,而不是流。您需要做的是在函数StreamUtils.CopyStream(Stream source,Stream target)中定义一个目标流。您对
request.AddFile()
的调用似乎与任何可用的方法签名都不匹配:。这有帮助吗?它提供了如何使用RestSharp@rekcul上传文件的答案嘿,你能提供一个示例代码吗?
public void UploadModel(string ProjectId, string filename, Stream sourceStream, Stream targetStream)
{
    // .... your code still here, just want to show the changing lines
    request.AddFile("file", StreamUtils.CopyStream(sourceStream, targetStream), filename);
}
public static void CopyStream(Stream source, Stream target)
public static void CopyStream(Stream source, Stream target, byte[] buffer)
public static byte[] CopyStream(Stream source, Stream target)
public static byte[] CopyStream(Stream source, Stream target, byte[] buffer)
public static byte[] CopyStream(Stream source, Stream target, byte[] buffer)
{
    // -> Define a byte array
    byte[] bytesToReturn;

    // -> Fill the array with data
    // ...

    // -> return the array
    return bytesToReturn;
}