如何使用 Flurl 上传文件和表单数据?
How can I upload a file and form data using Flurl?
我正在尝试上传包含正文内容的文件。 PostMultipartAsync
是唯一的方法吗?
在我的 C# 后端代码中,我有这个:
var resource = FormBind<StorageFileResource>();
var file = Request.Files.First().ToPostedFile();
FormBind
从请求中读取数据并填充对象。
通过使用 PostMultipartAsync
我知道它应该这样开始:
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)})
,但我不知道如何添加对象。你对此有什么想法吗?
这是我目前的尝试:
public static async Task<T> PostFileAsync<T>(string url, object data, string name, Stream stream, object queryString = null)
where T : class
{
return await HandleRequest(async () => queryString != null
? await url
.SetQueryParams(queryString)
.SetClaimsToken()
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)})
.ReceiveJson<T>()
: await url
.SetClaimsToken()
.PostMultipartAsync((mp) => mp.AddFile(name, stream, name))
.ReceiveJson<T>());
}
前端正在发出的当前请求:
有多种方法可以使用 Flurl 将 "parts" 添加到多部分 POST。我还没有将它添加到基本上演示了所有可能性的 docs yet but here's an example from the issue 中:
var resp = await "http://api.com"
.PostMultipartAsync(mp => mp
.AddString("name", "hello!") // individual string
.AddStringParts(new {a = 1, b = 2}) // multiple strings
.AddFile("file1", path1) // local file path
.AddFile("file2", stream, "foo.txt") // file stream
.AddJson("json", new { foo = "x" }) // json
.AddUrlEncoded("urlEnc", new { bar = "y" }) // URL-encoded
.Add(content)); // any HttpContent
这是一种适合我的方法
var result = await endPointApi
.AppendPathSegments("api","AppFileManager")
.WithOAuthBearerToken(token.AccessToken)
.PostMultipartAsync(mp => mp
//.AddFile("UploadFile", @"C:\Users\..\Documents\upload.txt")
.AddFile("UploadFile", new MemoryStream(data), appFile.FileName)
.AddStringParts(new
{
IRN = appFile.IRN,
TransactionIRN = appFile.TransactionIRN,
FileName = appFile.FileName,
TableName = appFile.TableName,
FileExtension = appFile.FileExtension,
})
Web Api 控制器实现(使用 MediatR)
[HttpPost]
public async Task<IActionResult> Post([FromForm] AppFileManagerCommands.Upload uploadAttachment)
{
await mediator.Send(uploadAttachment);
return NoContent();
}
我正在尝试上传包含正文内容的文件。 PostMultipartAsync
是唯一的方法吗?
在我的 C# 后端代码中,我有这个:
var resource = FormBind<StorageFileResource>();
var file = Request.Files.First().ToPostedFile();
FormBind
从请求中读取数据并填充对象。
通过使用 PostMultipartAsync
我知道它应该这样开始:
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)})
,但我不知道如何添加对象。你对此有什么想法吗?
这是我目前的尝试:
public static async Task<T> PostFileAsync<T>(string url, object data, string name, Stream stream, object queryString = null)
where T : class
{
return await HandleRequest(async () => queryString != null
? await url
.SetQueryParams(queryString)
.SetClaimsToken()
.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)})
.ReceiveJson<T>()
: await url
.SetClaimsToken()
.PostMultipartAsync((mp) => mp.AddFile(name, stream, name))
.ReceiveJson<T>());
}
前端正在发出的当前请求:
有多种方法可以使用 Flurl 将 "parts" 添加到多部分 POST。我还没有将它添加到基本上演示了所有可能性的 docs yet but here's an example from the issue 中:
var resp = await "http://api.com"
.PostMultipartAsync(mp => mp
.AddString("name", "hello!") // individual string
.AddStringParts(new {a = 1, b = 2}) // multiple strings
.AddFile("file1", path1) // local file path
.AddFile("file2", stream, "foo.txt") // file stream
.AddJson("json", new { foo = "x" }) // json
.AddUrlEncoded("urlEnc", new { bar = "y" }) // URL-encoded
.Add(content)); // any HttpContent
这是一种适合我的方法
var result = await endPointApi
.AppendPathSegments("api","AppFileManager")
.WithOAuthBearerToken(token.AccessToken)
.PostMultipartAsync(mp => mp
//.AddFile("UploadFile", @"C:\Users\..\Documents\upload.txt")
.AddFile("UploadFile", new MemoryStream(data), appFile.FileName)
.AddStringParts(new
{
IRN = appFile.IRN,
TransactionIRN = appFile.TransactionIRN,
FileName = appFile.FileName,
TableName = appFile.TableName,
FileExtension = appFile.FileExtension,
})
Web Api 控制器实现(使用 MediatR)
[HttpPost]
public async Task<IActionResult> Post([FromForm] AppFileManagerCommands.Upload uploadAttachment)
{
await mediator.Send(uploadAttachment);
return NoContent();
}