C#Rest API文件上传
我也尝试通过API上传一个带有C#的文件 StreamUtils不起作用,我收到错误:“无法将lambda表达式转换为'string'类型,因为它不是委托类型” 你知道怎么上传文件吗? 大约是100MBC#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(
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变量
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;
}